Stream 流


一、概述

流式思想(Stream)类似于工厂车间的生产流水线,Stream 流不是一种数据结构,不保存数据,而是对数据进行加工处理,Stream 流可以看作是流水线上的一个工序,通过多个工序让一个原材料加工成一个商品

Stream 流

 

 

 

二、获取 Stream 流的常用方式

1、集合接口 Collection 的默认方法 stream()

Stream 流

 

 

 Stream 流

2、Stream 类中的静态方法

Stream 流

 

 

 Stream 流

3、测试

public class StreamDemo {
    public static void main(String[] args) {
        List<Person> personList = Arrays.asList(
                new Person(1, "大毛", 30, 175),
                new Person(1, "二毛", 25, 170),
                new Person(1, "三毛", 25, 170),
                new Person(1, "小毛", 20, 163));
        
        // 获取流的方式一、Collection 集合接口的 stream() 方法
        Stream<Person> personStream1 = personList.stream();
        
        // 获取流的方式二、Stream 类的静态方法 of()
        Stream<Person> personStream2 = Stream.of(
                new Person(1, "大毛", 30, 175),
                new Person(1, "二毛", 25, 170),
                new Person(1, "三毛", 25, 170),
                new Person(1, "小毛", 20, 163));
    }
}

 

三、Stream 常用方法简介及注意事项

1、常用方法

Stream 提供了众多的 API,这些方法可以分为两类

  • 终结方法: 返回值不是 Stream 类型的方法,不再支持链式调用
  • 函数拼接: 返回值类型仍然是 Stream 类型的方法(注意这里返回的 Stream 是一个新流),支持链式调用
方法名 方法作用 返回值类型 方法类型
count 统计数量 long 终结方法
foreach 遍历处理 void 终结方法
filter 过滤处理 Stream 函数拼接
limit 取前几个数据 Stream 函数拼接

2、注意事项

 

  • Stream 流只能操作一次
public class StreamDemo {
    public static void main(String[] args) {
        List<Person> personList = Arrays.asList(
                new Person(1, "大毛", 30, 175),
                new Person(1, "二毛", 25, 170),
                new Person(1, "三毛", 25, 170),
                new Person(1, "小毛", 20, 163));

        // 获取流、Collection 集合接口的 stream() 方法
        Stream<Person> personStream = personList.stream();
        // 第一次使用 Stream 流对象
        Stream<Person> limit = personStream.limit(1);
        // 第二次使用 Stream 流对象
        personStream.filter((item)-> Objects.equals(item.getAge(),25));
    }
}

Stream 流

 

 

可以看到,同一个 Stream 对象使用两次报错了

  • Stream 返回的是一个新的流
@Slf4j
public class StreamDemo {
    public static void main(String[] args) {
        List<Person> personList = Arrays.asList(
                new Person(1, "大毛", 30, 175),
                new Person(1, "二毛", 25, 170),
                new Person(1, "三毛", 25, 170),
                new Person(1, "小毛", 20, 163));

        // 获取流、Collection 集合接口的 stream() 方法
        Stream<Person> personStream = personList.stream();
        // 第一次使用 Stream 流对象
        Stream<Person> personLimitStream = personStream.limit(1);
        log.info("第一个 Stream 对象: {}",personStream);
        log.info("第二个 Stream 对象: {}",personLimitStream);
    }
}

Stream 流

从上面的结果可以得知两个 Stream 对象不是同一个对象

  • Stream 不调用终结方法,中间的操作不会执行
@Slf4j
public class StreamDemo {
    public static void main(String[] args) {
        List<Person> personList = Arrays.asList(
                new Person(1, "大毛", 30, 175),
                new Person(1, "二毛", 25, 170),
                new Person(1, "三毛", 25, 170),
                new Person(1, "小毛", 20, 163));

        // 获取流、Collection 集合接口的 stream() 方法
        Stream<Person> personStream = personList.stream();
       
        Stream<Person> personStream2 = personStream.filter((item) -> {
            log.info("过滤出年龄等于 20 的毛毛");
            boolean equals = Objects.equals(item.getAge(), 20);
            return equals;
        });
    }
}

上述代码无任何输出结果

让 Stream 调用终结方法 collect

@Slf4j
public class StreamDemo {
    public static void main(String[] args) {
        List<Person> personList = Arrays.asList(
                new Person(1, "大毛", 30, 175),
                new Person(1, "二毛", 25, 170),
                new Person(1, "三毛", 25, 170),
                new Person(1, "小毛", 20, 163));

        // 获取流、Collection 集合接口的 stream() 方法
        Stream<Person> personStream = personList.stream();

        List<Person> collect = personStream.filter((item) -> {
            log.info("过滤出年龄等于 20 的毛毛");
            boolean equals = Objects.equals(item.getAge(), 20);
            return equals;
        }).collect(Collectors.toList());

        log.info("输出结果: {}", JSONObject.toJSONString(collect));
    }
}

输出结果如下,可以看到 filter() 方法中的代码执行了

Stream 流

 

 

 

四、Stream 流常用 API

方法名 方法作用 参数 返回值 方法类型 详细案例
foreach 遍历流中每一个元素,交给 Consumer 函数进行处理
Consumer<? super T> action
void 终结方法 https://www.cnblogs.com/xiaomaomao/p/16468015.html
count 统计流中元素的个数   long  终结方法  https://www.cnblogs.com/xiaomaomao/p/16471312.html
 filter  过滤流中符合条件的数据,返回值为 true 代表符合条件的数据  Predicate<? super T> predicate  Stream  函数拼接  https://www.cnblogs.com/xiaomaomao/p/16471368.html
 limit  截取流中前 maxSize 个元素,maxSize 大于总数,则截取所有元素  long maxSize  Stream  函数拼接  https://www.cnblogs.com/xiaomaomao/p/16471417.html
 skip  跳过前 n 个元素,截取流中剩余的元素,如果 n 大于等于当前流的长度,则返回一个空流  long n  Stream  函数拼接  https://www.cnblogs.com/xiaomaomao/p/16471518.html
 map  将 T 类型的流转换成 R 类型的流  Function<? super T, ? extends R> mapper  Stream  函数拼接  https://www.cnblogs.com/xiaomaomao/p/16471571.html
 sorted(…)  对流中元素进行排序(支持自然排序和定制排序)  无参 / Comparator<? super T> comparator  Stream  函数拼接  https://www.cnblogs.com/xiaomaomao/p/16471802.html
 distinct  对流中元素进行去重    Stream  函数拼接  https://www.cnblogs.com/xiaomaomao/p/16471921.html
 match  allMatch、noneMatch、anyMatch(判断元素是否匹配指定条件)  Predicate<? super T> predicate  boolean  终结方法  https://www.cnblogs.com/xiaomaomao/p/16493073.html
 max、min  获取最大、最小值  Comparator<? super T> comparator  Optional  终结方法  https://www.cnblogs.com/xiaomaomao/p/16493180.html

原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/275422.html

(0)
上一篇 2022年7月19日
下一篇 2022年7月19日

相关推荐

发表回复

登录后才能评论