java的Stream流学习

java的Stream流(学习视频观后感)

stream流的相关知识点分为以下五种:创建流、中间操作,聚合操作,转换容器操作,顺序流/并行流切换

1. 创建流

创建流可以通过以下几种方式

list.stream(); //通过列表List转为stream
Stream.of(a,b,c...);//通过Stream.of静态方法
//还有其他与文件有关的文件流操作

2. 中间操作

filter // 按照表达式过滤 
map //映射,通常用于将对象某种成员变量提取出来 
sorted // 对流中元素进行排序,元素要实现比较接口,或者直接写一个比较器作为参数
distinct //对象要重写equals方法,基本类型不用
concat // 合并两个流 
limit  //限制从流中获取前n个元素
skip //跳过前n个元素

3. 聚合操作

//min,max,sum,count,average 这一类不用多说

//reduce 特殊的操作,可以自定义规则来对流操作,如将字符串用逗号相连
String result = persons.stream()
    .map(Person::getName)
    .reduce("", (a, b) -> a + b + ",");//第一个参数为初始值,后面规则

此外还有些操作,是短路操作,一旦符合条件,就结束处理,无需处理整个流

有效短路操作:找到符合条件的元素时结束处理,而不会处理整个流
anymatch
noneMatch 没有一个符合条件
allMatch 所有元素都符合条件
findFirst 返回第一个元素(返回类型为Optional,因为不确定是否为Null)
findAny 返回 任意一个元素(同上)

4. 转换容器操作

转换容器方法为 collect(Collector) ,Collector本身提供很多静态转换容器方法,如toList(),toMap()等。

List<Integer> ageList = persons.stream().map(Person::getAge).collect(Collectors.toList());

自定义Collector

ArrayList<String> collect = Stream.of("A", "C", "B", "D", "E", "F")
                .map(String::toLowerCase)
                .collect(Collector.of(
                        //Supplier
                        () -> {//定义容器类型
                            return new ArrayList<>();
                        },
                        //Accumulator 累加器
                        (list, item) -> {
                            list.add(item);
                        },
                        //combiner 用于并行流相邻两个数据段的合并
                        (left, right) ->
                        {
                            left.addAll(right);
                            return left;
                        }
                    // Collector.Characteristics.IDENTITY_FINISH //默认策略,将累加器结果作为最终结果
//                        Collector.Characteristics.UNORDERED //设置无序
//                        Collector.Characteristics.CONCURRENT 
                    
                ));
collect.forEach(System.out::println);

再来说一下Collector的三种配置:IDENTITY_FINISH,UNORDERED,CONCURRENT

IDENTITY_FINISH 是默认策略,将累加器结果作为最终结果

UNORDERED ,这里无序并不是指输出结果无序,而是不按流中元素输入的顺序执行。

CONCURRENT。默认情况下,在并行流中,流的每个分段处理结果都交给一个临时容器,处理结束后将各个临时容器的结果合并;而当配置CONCURRENT属性,则所有分段共享一个容器。需要注意,如果容器不是线程安全的,就会忽略这条属性。

5.顺序流/并行流

Stream操作默认顺序流,使用并行流需要加.parallel(),标志后面的操作都用并行流处理。并行流的工作机制是将流分为多个段,每个段交给一个线程负责,然后通过合并策略(也就是上面combiner)进行合并。

ArrayList<String> collect = Stream.of("A", "C", "B", "D", "E", "F")
                .parallel() //开并行流
                .map(String::toLowerCase)
                .collect(Collector.of(
                        //Supplier
                        () -> {//定义容器类型
                            return new ArrayList<>();
                        },
                        //Accumulator 累加器
                        (list, item) -> {
                            list.add(item);
                        },
                        //combiner 用于并行流相邻两个数据段的合并
                        (left, right) ->
                        {
                            left.addAll(right);
                            return left;
                        }
//                      Collector.Characteristics.IDENTITY_FINISH //默认策略,将累加器结果作为最终结果
//                        Collector.Characteristics.UNORDERED //设置无序
//                        Collector.Characteristics.CONCURRENT

                ));
        collect.forEach(System.out::println);
posted @ 2024-06-26 11:50  Liang2003  阅读(3)  评论(0编辑  收藏  举报