Stream流的基本操作

一、获取流

获取流有以下几种方式:

  1. 所有的 Collection 集合都可以通过 stream 默认方法获取流。

根据Collection获取流, java.util.Collection 接口中加入了default方法 stream 用来获取流,所以其所有实现类均可获取流。

//List集合获取流
List<String> list = new ArrayList<>();
Stream<String> stream1 = list.stream();
//Set集合获取流
Set<String> set = new HashSet<>();
Stream<String> stream2 = set.stream();
//Vecter获取流
Vector<String> vector = new Vector<>();
Stream<String> stream3 = vector.stream(); 

根据Map获取流,java.util.Map 接口不是 Collection 的子接口,且其K-V数据结构不符合流元素的单一特征,所以获取对应的流需要分key、value或entry等情况:

Map<String, String> map = new HashMap<>();

Stream<String> keyStream = map.keySet().stream();

Stream<String> valueStream = map.values().stream();

Stream<Map.Entry<String, String>> entryStream = map.entrySet().stream();
  1. Stream 接口的静态方法 of 可以获取数组对应的流。
String[] array = { "张三", "李四", "王五", "赵六" };
Stream<String> stream = Stream.of(array);
//of 方法的参数其实是一个可变参数,所以支持数组
Stream<String> stream1 = Stream.of(1, 2, 3, 4, 5);

二、中间操作

一个中间操作链,对数据源的数据进行处理。
中间操作有如下几种:

1.过滤 filter 
2.去重 distinct 
3.排序 sorted 
4.截取 limit
5.跳跃 skip 
6.转换map/flatMap 
7.其他 peek

1、filter:接收 Lambda , 从流中排除某些元素。
获取1~5之间的偶数

Arrays.asList(1, 2, 3, 4, 5).stream().filter(x->x%2==0).forEach(System.out::println);

2、distinct:筛选,通过流所生成元素的 hashCode() 和 equals() 去除重复元素。
去除集合中的重复元素

Arrays.asList(1,2,3,4,5,6,7,7,7,7).stream().distinct().forEach(System.out::println);

3、sorted:集合中的元素排序并且是倒序

Arrays.asList(1,2,3,4,5,6).stream().sorted((a,b)->b-a).forEach(System.out::println);

4、limit:截断流,使其元素不超过给定数量。
取集合中的第一条数据

Arrays.asList(1,2,3,4,5,6,7).stream().limit(1).forEach(System.out::println);

5、skip:跳过元素,返回一个扔掉了前 n 个元素的流。若流中元素不足 n 个,则返回一个空流。与 limit(n) 互补
跳过集合中的第一条数据

Arrays.asList(1,2,3,3,4,5).stream().skip(1).forEach(System.out::println);

6、map:接收Lambda,将元素转换成其他形式或提取信息。接收一个函数作为参数,该函数会被应用到每个元素上,并将其映射成一个新的元素。
String转Integer

 Arrays.asList("1","2","3","5").stream().map(x->Integer.valueOf(x)).forEach(System.out::println);

7、peek:类似于打印日志的功能在进行操作时查看当前值

Arrays.asList("1","2","3","5").stream().peek(System.out::println).forEach(System.out::println);

三、终止操作

一个终止操作,执行中间操作链,并产生结果。
终止操作有如下几种:

1、循环 forEach
2、计算 min、max、count、 average
3、匹配 anyMatch、 allMatch、 noneMatch、findFirst、 findAny
4、汇聚 reduce
5、收集器 toArray collect

1、forEach循环

Arrays.asList("1","2","3","5").stream().forEach(System.out::println);

2、min最小值

Integer min = Arrays.asList(1, 3, 4, 5, 2).stream().min((a, b) -> a - b).get();

3、max最大值

Integer max = Arrays.asList(1, 3, 4, 61, 1).stream().max((a, b) -> a - b).get();

4、count :集合中元素的数量

long count = Arrays.asList(1, 2,3, 4, 5, 6).stream().count();

5、average 计算

double avg = Arrays.asList(1, 3, 4, 61, 1).stream().mapToLong(x -> Long.valueOf(x + "")).average().getAsDouble();

6、findFirst匹配,返回第一个元素。

//用于返回满足条件的第一个元素
Optional<Integer> first= Arrays.asList(1, 2, 3, 4, 5).stream().filter(x -> x % 2 == 0).findFirst();

7、reduce归约,可以将流中元素反复结合起来,得到一个值。

//reduce 根据一定的规则将Stream中的元素进行计算后返回一个唯一的值。
//求和
Integer reduce = Arrays.asList(1, 2, 3, 4, 5).stream().reduce((a, b) -> a + b).get();

8、collect收集,Collector接口中方法的实现决定了如何对流执行收集操作(如收集到List、Set、Map)。但是Collectors实用类提供了很多静态方法,可以方便地创建常见收集器实例,具体方法与实例如下表:
Stream流的基本操作_第1张图片

List<Integer> collect = Arrays.asList(1, 2, 3, 4, 5).stream().filter(x -> x % 2 == 0).collect(Collectors.toList());

你可能感兴趣的:(Stream流的基本操作)