JDK8新特性-Stream

本文介绍 Java 中 Stream API 的基本概念及其应用场景,包括 Stream 的创建、转换操作如 filter、map 和 flatMap,以及终端操作如 count 和 forEach。通过具体示例展示了如何利用 Stream API 进行高效的数据处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

A sequence of elements supportingsequential and parallel aggregateoperations

1Stream是元素的集合;

2、可以支持顺序和并行的对原Stream进行汇聚操作;

可以把Stream当成一个高级版本的Iterator。原始版本的Iterator,用户只能一个一个的遍历元素并对其执行某些操作;高级版本的Stream,用户只要给出需要对其包含的元素执行什么操作,比如“过滤掉长度大于10的字符串”等,具体这些操作如何应用到每个元素上,就给Stream就好了!


List<Integer>nums =Lists.newArrayList(1,null,3,4,null,6);

nums.stream().filter(num->num !=null).count();

以上这段代码的意思就是获取列表中不为空的个数。

Stream通用语法:



Stream的创建:

1、通过Stream接口的静态工厂方法

2、通过Collection接口的默认方法


Stream转换

11.distinct:对于Stream中包含的元素进行去重操作(去重逻辑依赖元素的equals方法

22.filter:对于Stream中包含的元素使用给定的过滤函数进行过滤操作

33.map:对于Stream中包含的元素使用给定的转换函数进行转换操作

44.flatMap:和map类似,不同的是其每个元素转换得到的是Stream对象,会把子Stream中的元素压缩到父集合

5peek:生成一个包含原Stream的所有元素的新Stream,同时会提供一个消费函数(Consumer实例),新Stream每个元素被消费的时候都会执行给定的消费函数

6limit:对一个Stream进行截断操作,获取其前N个元素,如果原Stream中包含的元素个数小于N,那就获取其所有的元素

7skip:返回一个丢弃原Stream的前N个元素后剩下元素组成的新Stream,如果原Stream中包含的元素个数小于N,那么返回空Stream


使用示例:

List<Integer> nums = Lists.newArrayList(1, null, 3, 4, null, 6);
        //distinct
        System.out.println("********** distinct **********");
        nums.stream().distinct().forEach(x -> System.out.println(x));

        //filter
        System.out.println("********** filter **********");
        nums.stream().filter(num -> num != null && num > 2).forEach(x -> System.out.println(x));

        //map
        System.out.println("********** map **********");
        nums.stream().map(num -> num != null ? num++ : null).forEach(x -> System.out.println(x));

        //flatMap
        System.out.println("********** flatMap **********");
        Stream<List<Integer>> inputStream = Stream.of(Arrays.asList(1), Arrays.asList(2, 3), Arrays.asList(4, 5, 6));
        Stream<Integer> outputStream = inputStream.
                flatMap((childList) -> childList.stream());
        outputStream.forEach(x -> System.out.println(x));
        //peek
        System.out.println("********** peek **********");
        Stream.of("one", "two", "three", "four").filter(e -> e.length() > 3)
                .peek(e -> System.out.println("Filtered value: " + e)).map(String::toUpperCase)
                .peek(e -> System.out.println("Mapped value: " + e)).collect(Collectors.toList());

        // forEach 是 terminal 操作,因此它执行后,Stream 的元素就被“消费”掉了,        你无法对一个 Stream 进行两次 terminal 运算,所以可以使用peek操作
        Stream s = Stream.of("one", "two", "three", "four");
        s.forEach(e -> System.out.println("forEach1:" + e));
        s.forEach(e -> System.out.println("forEach2:" + e));
        //limit
        System.out.println("********** limit **********");
        nums.stream().limit(4).forEach(x -> System.out.println(x));

        //skip
        System.out.println("********** skip **********");
        nums.stream().skip(4).forEach(x -> System.out.println(x));


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值