文章目录
Stream流
如何获得Stram流
1、通过Collection集合得到Steam流
Collection提供了stream()
示例:
List<String> list = new ArrayList<>();
list.add("aaa");
list.add("bbb");
list.add("ccc");
// 得到Stream流对象
Stream<String> stream = list.stream();
2、通过Stream.of()得到Steam对象
示例:
Integer[] arr = new Integer[]{1, 2};
// 这里有两个对象 1,2
Stream<Integer> arr1 = Stream.of(arr);
注意:Stream.of(T… values) 参数应该是对象类型
示例:
// 这里是将int[]作为一个对象来传递的
int[] arr1 = new int[]{1, 2, 3, 4};
// 里面只有一个对象,就是arr1
Stream<int[]> arr11 = Stream.of(arr1);
3、Arrays中的stream()创建
Integer[] arr = new Integer[]{1, 2};
int[] arr1 = new int[]{1, 2, 3, 4};
Stream<Integer> stream2 = Arrays.stream(arr);
IntStream stream3 = Arrays.stream(arr1);
Stream流中的应用
Stream流中的方法包括两大类
- 中间方法(返回的是Stream流对象)
- 终结方法(返回的是非流对象)
Stream流的应用(步骤)
获取Stream流->中间方法->结束方法
注意:Stream流只能操作一次
List<String> list = new ArrayList<>();
list.add("aaa");
list.add("bbb");
list.add("ccc");
// 得到Stream流对象
Stream<String> stream = list.stream();
// stream这个流使用过一次,且已经调用了结束方法
System.out.println(stream.count());
// 再次使用这个流,将会报错
System.out.println(stream.count());
重复使用一个流报下面这个错误
终结方法
count()
返回流中的对象个数
List<String> list = new ArrayList<>();
list.add("aaa");
list.add("bbb");
list.add("ccc");
// 得到Stream流对象
Stream<String> stream = list.stream();
System.out.println(stream.count()); // 3
int[] arr1 = new int[]{1, 2, 3, 4};
Stream<int[]> arr11 = Stream.of(arr1);
System.out.println(arr11.count()); // 1
forEach()
流中的每个元素执行括号内的方法
示例:打印流中的每个元素
list.stream().forEach(System.out::println);
reduce()
Stream<Integer> stream01 = Stream.of(4,3,5,9);
Integer sum = stream01.reduce(0,(a,b)-> a + b);
System.out.println("求和:"+sum);
Stream<Integer> stream01 = Stream.of(4,3,5,9);
Optional<Integer> max= stream01.reduce((x, y)-> x < y ? x : y);
System.out.println("最小值为:"+max.get());
中间方法
distinct()
去除流中重复的元素
List<String> list = new ArrayList<>();
list.add("aaa");
list.add("bbb");
list.add("ccc");
list.add("aaa");
// 得到Stream流对象
list.stream().forEach(System.out::println);// aaa bbb ccc aaa
list.stream().distinct().forEach(System.out::println);// aaa bbb ccc
filter()
过滤集合中的元素
示例:过滤大于1的数字,并打印
Integer[] arr = new Integer[]{1, 2};
Stream<Integer> stream1 = Stream.of(arr);
Stream.of(arr).filter(e -> e > 1).forEach(System.out::println);// 2
limit()
取前几个元素
示例:
List<String> list = new ArrayList<>();
list.add("aaa");
list.add("bbb");
list.add("ccc");
// 去list的前两个元素并打印
list.stream().limit(2).forEach(System.out::println);// aaa bbb
skip()
跳过几个元素
示例:
List<String> list = new ArrayList<>();
list.add("aaa");
list.add("bbb");
list.add("ccc");
// 跳过前两个元素并打印
list.stream().skip(2).forEach(System.out::println);// ccc
collect()
组合
示例:
// 将流数据转换为列表类型
List<Integer> collect = Stream.of(arr).collect(Collectors.toList());
System.out.println(collect);
// 分组
List<Student> list1 = new ArrayList<>();
list1.add(new Student("王五", "1"));
list1.add(new Student("张三", "1"));
list1.add(new Student("李四", "1"));
list1.add(new Student("赵柳", "2"));
// 根据年龄进行分组
Map<String, List<Student>> collect1 = list1.stream().collect(Collectors.groupingBy(Student::getClassName));
System.out.println(collect1);
执行结果
map()
可以将流中的元素映射到另一个流中。即:可以将一种类型的流转换为另一种类型的流
Stream.of(arr).map(e->(double)e).forEach(System.out::println);
flagMap()
和map类似,map操作是对象类型,flagMap操作的是流对象
List<List<Integer>> lists = new ArrayList<>();
lists.add(Arrays.asList(arr));
lists.stream().flatMap(item->item.stream().filter(e->e>1)).forEach(System.out::println);// 2