java8 集合流式操作

一. 基本概念

1.1 什么是流

不是集合,不是数据结构,不保存数据,它类似于 Iterator,对数据进行并行或者串行遍历,然后对数据进行一系列计算、过滤等操作,最终得到结果。

1.2 为什么加入集合的流式操作

  • 更容易对集合进行一系列的操作:如过滤、转换、统计等

  • 可以并行的对集合进行操作,速度更快

  • 配合lambda使用可读性更强,代码更加简洁

2.1 中间操作( intermediate,可以连续多个 )

filter(): 对元素进行过滤

sorted():对元素排序

map():元素映射

distinct():去除重复的元素

        List<Integer> list = Arrays.asList(new Integer[]{1,2,3,5,7,8,10,10}) ;
    
//      List<Integer> list2 = list.stream().filter((k)-> k%2==0).collect(Collectors.toList());
        //集合数据按照条件进行过滤,不符合条件的直接扔掉
        list.stream().filter((k)-> k%2==0).forEach(System.out::println );
        //对数据进行排序,也可以使用 lambda自定义函数排序
        list.stream().sorted().forEach(System.out::println );
                //对所有数据进行统一的计算,得到一个新的集合
        list.stream().map(  k->k+10 ).forEach(System.out::println );
        //对集合中数据 去重
        list.stream().distinct(  ).forEach(System.out::println );

2.2 最终操作( terminal ,只能有一个)

  • forEach():遍历每个元素。

  • reduce():把Stream 元素数据整合然后统计。例如,字符串拼接,数值的 sum,min,max ,average 都是特殊的 reduce。

  • collect():返回一个新的集合。

  • min():找到最小值。

  • max():找到最大值。

三、函数操作实例

3.1 构建stream对象

// 1. Individual values
Stream stream = Stream.of("a", "b", "c");
// 2. Arrays
String [] strArray = new String[] {"a", "b", "c"};
stream = Stream.of(strArray);
stream = Arrays.stream(strArray);
// 3. Collections
List<String> list = Arrays.asList(strArray);
stream = list.stream();

3.2 基础的操作实例

        List<Integer> list = Arrays.asList(new Integer[]{1,2,3,5,7,8,10,10}) ;
//      List<Integer> list2 = list.stream().filter((k)-> k%2==0).collect(Collectors.toList());
        //对集合数据进行 加减乘,得到最后的结果
        Integer result = list.stream().reduce((a,b)->a+b  ).get();
        System.out.println( result );
        //返回集合set
        HashSet<Integer> set1 = list.stream().collect( Collectors.toCollection( ( )->{return new HashSet<>();  }) );
        System.out.println( set1 );

 
        //获取列表中的最大值
        Integer maxVal =  list.stream().max((x,y)->{
           return x>y?1:-1;
        }).get();
        System.out.println( maxVal );

四、参考

https://developer.ibm.com/zh/articles/j-lo-java8streamapi/

https://www.ibm.com/developerworks/cn/java/j-lo-jdk8newfeature/index.html