为了提高程序员对数组和集合的操作便利性而推出的操作--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("薛之谦");//只要有一个元素匹配条件,就返回trueboolean anyMatch =list.stream().anyMatch(e->e.contains("宁"));//必须全部匹配,才返回trueboolean allMatch =list.stream().allMatch(e->e.contains("宁"));//全部不匹配,才返回trueboolean 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);}