文章列表
Stream
Stream 是jdk1.8提供的新特性,主要用于集合的迭代处理解决方案
类似于Iterator 迭代器,但是功能更加强大
iterator主要功能:
主要用于集合的遍历
Collectin<E> coll = new ArrayList<E>();
coll.add("aaa");
coll.add("bbb");
Iterator it = coll.Iterator();
while (it.hasNext()) {//判断是否具有下一个元素,如果有的话返回true
//next() 方法获取下一个元素
String
}
String str = it.next();
}
//for循环
普通for循环
for-each
//迭代循环
Iterator
Lambda表达式:
([参数列表])->{
语句块
}
主要用于接口的实现:
1.集合中有一个抽象方法
2.@FunctionalInterface检查该接口符不符合使用lambda表达式
@FunctionalInterface
Interface Iservice{
public int add(int i,int j);
}
通过lambda表达式进行实现:
IService is = (i,j)-> i+j;
is.add(100,200);
Stream对象的创建:
1.通过集合的stream()方法进行创建
List<Integer> list = new ArrayList<Integer>();
list.add(111);
list.add(222);
list.add(333);
//对list创建了一个stream的流化数据
Stream stream = list.stream();
2.通过数组的工具类Arrays的stream()方法进行创建
String[] strs = {"aaa","bbb","ccc","ddd"};
Stream stream = Arrays.stream(strs);
stream.forEach(System.out::println):
3.通过Stream自身静态方法进行创建
static of(t)方法:
4.IntStream.Range(1,10); 创建整形数组流
5.Randow rm = new Random().ints(10,1,100); 创建随着生成的整形数组流
Stream的迭代:
分类:
外部迭代:
串行迭代:单线程运行
内部迭代:
并行迭代:多线程运行
Lambda表达式:函数式接口
主要作用:
对接口中的抽象方法提供直接重写实现。
接口中的抽象方法一般需要通过实现类来进行重写,但是这种方法比较麻烦,
jdk1.8提供了新的实现方式Lmabda表达式。
Interface IService{
public int add(int i,int j);
}
实现方式一:
通过实现类进行重写。
public class IServiceImpl implements Iservice{
public int add(int i,intj){
return i + j;
}
}
public static void main(String[] args){
Iservice is = new IserviceImpl();
is.add(5,8);
}
实现方式二:
public static void main(String[] args){
Iservice is = new Iservice{
public int add(int i, intj){
return i+j;
}
};
}
实现方式三:
通过lambda表达式进行实现:
语法:
([int i,int j])->{
return i+j;
}
什么样的接口能够使用lambda表达式:
1.接口里只有一个抽象方法
2.@FunctionalInterface注解:主要作用是检测该接口是否可以使用lambda表达式
Lambda表达式的使用:
IService is = (int i, int j)->{
return i+j;
};
int sum = is.add(5,8);
简写规则:
1.参数类型可以省略不写,只写参数名称
2.当语句块只有一句话的时候,可以省略大括号不写,return 关键字也不用写
简写实例:
IService is = (i,j)-> i + j;
Stream的操作:
无状态操作:
通过相关方法如map,filter等方法的对流进行操作但是不改变流的内部元素,称为无状态操作。
有状态操作:
通过distinct,sorted等方法的操作,会改变流内元素,生成新的流对象的操作,称为有状态的操作。
常用方法:
1.distinct()去重复项的方法
直接使用流对象进行调用。
stream.distinct();
2.filter(lambda);过滤方法
3.map(lambda)方法:类型转换
4.mapToInt(lambda); 类型转换
5.mapToLong(lambda); 类型转换
6.mapToDouble(lambda);类型转换
7.flatMap(lambda); 当数组中的元素还是数组的话,可以同flatMap方法提取出来,合并形成新的流。
String[] ss={"a b c d","1 2 3 4","e f g h","5 6 7 8"};
Stream.of(ss).map(s->s.split(" ")).flatMap(Arrays::stream).forEach(System.out::println);
8.peek()方法:作用是使用peek方法产生一个新的stream流对象,并且在执行peek方法中的lambda表达式的
时候,或逐一调用新的stream流中每一个元素。
9.limit(int n)方法:作用截取Stream流中的前n个元素
比如:stream流对象中有10个元素,limit(5):获取流中的前5个元素
10.skip(int n)方法:用于抹去前n个元素,获取n后面的元素
比如:stream流对象中有10个元素,skip(5):获取流中的从第六个元素开始后面的所有元素
11.reduce方法:把流里面的元素进行归一化处理,比把连个元素进行拼接。
Stream的惰性求值:
什么是惰性求值:
在方法声明之后,如果没有最终使用它的话,不执行中间操作,等需要使用的时候再加载。
惰性求值的好处:
在注册的时候不执行操作,在使用的时候再执行中间操作:提高程序的运行效率。
Optional类:
final:最终类
直接继承Object类
作用:规避大部分的空指针 NullPointException异常
位置:用于方法的返回值或取值运算中
构造方法:无
Optional实例化:
Optional.of([参数]);
参数:不予许为空
Optional.ofNullable(参数);
参数:允许为空
Optional.empty();
返回空的Optional对象:Optional.empty
常用方法:
get():获取Optional对象中的值
orElse(参数); 当结果为空值的时候返回一个指定参数默认值
orElseGet(lambda) 如果optional2为空值,可以调用一个lambda表达式
orElseThrow(lambda) 如果optional2为空值则调用返回指定的异常
filter()过滤方法,如果Optional对象满足filter指定的条件则返回数据,否则返回空