为了提高程序员对数组和集合的操作便利性而推出的操作--Stream流
1.流的创建
数组用Arrays.stream(数组名)来获取流
集合用集合.stream()来获取流
String [] strings;
List list =new ArrarList<>();
//数组
stream =Arrays.stream(strings)
//集合
stream =list.stream();
2.操作流
1)过滤
调用filter可以过滤出流中符合条件的元素,filter方法参数可以支持一个Lambda表达式
List<String> list =new ArrayList<>();
list.add("宁舒意");
list.add("周杰伦");
list.add("薛之谦");
//过滤出包含”宁“的元素
Stream<String> stream =list.stream().filter(e->e.contains("宁"));
stream.forEach(System.out::println);
stream.forEach(System.out::println);
这行代码解读一下,forEach就是遍历流的所有元素,类名::方法就相当于调用类中的方法。
这行代码就是对于流中的每个元素都调用一次啊这个输出方法,元素就是输出的参数
2)映射
map()方法就是将流中所有元素按照map方法参数中的规则转换成新的流中的元素。
/**
* 映射,将流中每个元素都按照map()括号里面的规则进行转换,但是原来的流不变,只是创建新流
**/
private static void f3(){
List<String> list =new ArrayList<>();
list.add("宁舒意");
list.add("周杰伦");
list.add("薛之谦");
//这里map里面的参数表示调用String的legth方法,即返回每个字符串的长度
Stream<Integer> stream =list.stream().map(String::length);
stream.forEach(System.out::println);
}
3)匹配
匹配,判断该流是否符合条件
stream.anyMatch()有一个元素匹配,就返回true
stream.allMatch()全部匹配,才返回true
stream.noneMatch()全部不匹配,才返回true
/**
* 匹配
**/
private static void f4(){
List<String> list =new ArrayList<>();
list.add("宁舒意");
list.add("周杰伦");
list.add("薛之谦");
//只要有一个元素匹配条件,就返回true
boolean anyMatch =list.stream().anyMatch(e->e.contains("宁"));
//必须全部匹配,才返回true
boolean allMatch =list.stream().allMatch(e->e.contains("宁"));
//全部不匹配,才返回true
boolean noneMatch =list.stream().noneMatch(e->e.contains("宁"));
}
4)组合
组合就是调用reduce()方法将流中的元素按照reduce()方法参数定义的Lambda规则都组合起来,比如:将六种所有元素都加起来。
reduce((a,b)-> a+b)
也可以设置一个起始值放在第一个参数:reduce(6,(a,b)-> a+b) ,这会将流中所有元素都加起来再加6。
/**
* 组合
**/
private static void f5(){
Integer[] ints ={0,1,2,3};
List<Integer> list =Arrays.asList(ints);
//reduce方法的参数可以接受一个lambda表达式
Optional<Integer> optional1 =list.stream().reduce((a,b)->a+b);
Optional<Integer> optional2 =list.stream().reduce(Integer::sum);
System.out.println(optional1.orElse(0));
System.out.println(optional2.orElse(0));
int reduce =list.stream().reduce(6,(a,b)->a+b);
System.out.println(reduce);
int reduce1 =list.stream().reduce(6,Integer::sum);
System.out.println(reduce1);
}
5)转换流
可以把流转换回数组或者集合,collect()
stream.toArray,可以将流转换成数组
private static void f6(){
List<String> list =new ArrayList<>();
list.add("宁舒意");
list.add("周杰伦");
list.add("薛之谦");
//将集合转换成stream流,再调用toArray方法转换成数组
String[] strings =list.stream().toArray(String[]::new);
List<Integer> list1 =list.stream().map(String::length).collect(Collectors.toList());
List<String> list2 =list.stream().collect(Collectors.toCollection(ArrayList::new));
System.out.println(list1);
System.out.println(list2);
String str =list.stream().collect(Collectors.joining(",")).toString();
System.out.println(str);
}