java8的Stream api实战精辟解读

文章目录

    • 前言
    • 1.Stream的概念:
      • 1.1流的构成:
      • 1.2 Stream的生成方式:
      • 2.1创建对象:
      • 2.2单元测试进行应用:
      • 2.3常用方法介绍:
    • 3总结

前言

虽然java的jdk已经更新到了15,但是身边的大多数项目还是用的jdk8,java8稳定成熟足以可见。本篇来介绍java8比较酷炫的的Stream api,希望能帮助到学习java编程的朋友。

1.Stream的概念:

Stream API是对容器对象功能的增强,专注于对容器对象进行各种便利、高效的聚合操作,结合Lambda表达式,极大的提高编程效率和程序可读性。我的直接感觉就是之前需要也很多循环的代码可能一行代码搞定,并且性能不会受影响,bug更少。

1.1流的构成:

当我们使用一个流的时候,通常包含三个基本步骤:获取数据源(source)-》数据转换->执行操作获取想要的结果。每次转换生成新的Stream对象,原有的不变。

1.2 Stream的生成方式:

最常用的是从集合和数组中获取:

Collection.stream()
Collection.parallelStream()
Arrays.stream(T array) or Stream.of()

从BfferedReader获得:

java.io.BufferedReader.lines()

静态工厂:

java.util.stream.IntStream.range()
java.nio.file.Files.walk()

自己构建:

java.util.Spliterator

其他:

Random.ints()
BitSet.stream()
Pattern.splitAsStream(java.lang.CharSequence)
JarFile.stream()
参考:
https://blog.csdn.net/justloveyou_/article/details/79562574

2.1创建对象:

上面概念介绍的比较多,但是我们可能更多的关注的是实际应用:

@Data
public class Apple {
    private Integer id;
    private String name;
    private BigDecimal money;
    private Integer num;
    public Apple(Integer id, String name, BigDecimal money, Integer num) {
        this.id = id;
        this.name = name;
        this.money = money;
        this.num = num;
    }

}

2.2单元测试进行应用:

下面的代码就是完成流的api的常用方法分组、list转map、过滤filter、求和、查找最大值和最小值、去重等使用demo:

 List<Apple> appleList = new ArrayList<>();//存放apple对象集合

        Apple apple1 =  new Apple(1,"苹果1",new BigDecimal("3.25"),10);
        Apple apple12 = new Apple(1,"苹果2",new BigDecimal("1.35"),20);
        Apple apple2 =  new Apple(2,"香蕉",new BigDecimal("2.89"),30);
        Apple apple3 =  new Apple(3,"荔枝",new BigDecimal("9.99"),40);
        appleList.add(apple1);
        appleList.add(apple12);
        appleList.add(apple2);
        appleList.add(apple3);
        //1.分组
        //List 以ID分组 Map<Integer,List<Apple>>
        Map<Integer, List<Apple>> groupBy = appleList.stream().collect(Collectors.groupingBy(Apple::getId));
        System.err.println("groupBy:"+groupBy);
        //2.List转Map
        /**
         * List -> Map
         * 需要注意的是:
         * toMap 如果集合对象有重复的key,会报错Duplicate key ....
         *  apple1,apple12的id都为1。
         *  可以用 (k1,k2)->k1 来设置,如果有重复的key,则保留key1,舍弃key2
         */
        Map<Integer, Apple> appleMap = appleList.stream().collect(Collectors.toMap(Apple::getId, a -> a,(k1,k2)->k1));
        System.out.println(appleMap);
        //3.过滤Filter
        //过滤出符合条件的数据
        List<Apple> filterList = appleList.stream().filter(a -> a.getName().equals("香蕉")).collect(Collectors.toList());
        System.out.println(filterList);
        //4.求和
        //计算 总金额
        BigDecimal totalMoney = appleList.stream().map(Apple::getMoney).reduce(BigDecimal.ZERO, BigDecimal::add);
        System.err.println("totalMoney:"+totalMoney);
        //5.查找流中最大 最小值

//    主要是利用  Collectors.maxBy 和 Collectors.minBy 来计算流中的最大或最小值。
//        6.去重
      List<Apple>list=  appleList.stream().distinct().collect(Collectors.toList());

2.3常用方法介绍:

工厂方法

返回类型

作用

toList

List

把流中所有项目收集到一个 List

toSet

Set

把流中所有项目收集到一个 Set,删除重复项

toCollection

Collection

把流中所有项目收集到给定的供应源创建的集合menuStream.collect(toCollection(), ArrayList::new)

counting

Long

计算流中元素的个数

sumInt

Integer

对流中项目的一个整数属性求和

averagingInt

Double

计算流中项目 Integer 属性的平均值

summarizingInt

IntSummaryStatistics

收集关于流中项目 Integer 属性的统计值,例如最大、最小、 总和与平均值

joining

String

连接对流中每个项目调用 toString 方法所生成的字符串collect(joining(", "))

maxBy

Optional

一个包裹了流中按照给定比较器选出的最大元素的 Optional, 或如果流为空则为 Optional.empty()

minBy

Optional

一个包裹了流中按照给定比较器选出的最小元素的 Optional, 或如果流为空则为 Optional.empty()

reducing

归约操作产生的类型

从一个作为累加器的初始值开始,利用 BinaryOperator 与流 中的元素逐个结合,从而将流归约为单个值累加int totalCalories = menuStream.collect(reducing(0, Dish::getCalories, Integer::sum));

collectingAndThen

转换函数返回的类型

包裹另一个收集器,对其结果应用转换函数int howManyDishes = menuStream.collect(collectingAndThen(toList(), List::size))

groupingBy

Map<K, List>

根据项目的一个属性的值对流中的项目作问组,并将属性值作 为结果 Map 的键

partitioningBy

Map<Boolean,List>

根据对流中每个项目应用谓词的结果来对项目进行分区

3总结

上面就完成了java8中Stream的介绍和实战分享,感觉真的是非常的好用,希望看到的朋友能够实际应用到自己的项目中。如果你喜欢我的分享的话,欢迎转载,点赞和赞赏。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值