当前位置:首页 > 科技  > 软件

我们一起聊聊 Java Steam 常用 API

来源: 责编: 时间:2023-11-10 09:15:19 402观看
导读现在 Java 17 和 Java 11 基本上可以和 Java8 平分 JDK 装机比例。下面是我常用的一些 Strem API 操作。除了分组、转换、排序,如果大家还有更多常用的 API 可以一起留言交流。分组List 默认分组过后是 Map<Key, List>

现在 Java 17 和 Java 11 基本上可以和 Java8 平分 JDK 装机比例。下面是我常用的一些 Strem API 操作。除了分组、转换、排序,如果大家还有更多常用的 API 可以一起留言交流。4As28资讯网——每日最新资讯28at.com

分组

List 默认分组过后是 Map<Key, List>4As28资讯网——每日最新资讯28at.com

List<StreamItem> streamList = Stream.of(        new StreamItem(1, "k1"),        new StreamItem(2, "k1"),        new StreamItem(3, "k2"),        new StreamItem(4, "k2")).collect(Collectors.toList());System.out.println(streamList);//1.1分组Map<String, List<StreamItem>> streamMap1 = streamList.stream().collect(Collectors.groupingBy(StreamItem::getKey));System.out.println(streamMap1);//输出:{k1=[StreamItem{id=1, key='k1', name='i_1|k_k1'}, StreamItem{id=2, key='k1', name='i_2|k_k1'}], k2=[StreamItem{id=3, key='k2', name='i_3|k_k2'}, StreamItem{id=4, key='k2', name='i_4|k_k2'}]}

List 默认分组过后是 Map<Key, Object>4As28资讯网——每日最新资讯28at.com

//1.2分组只拿第一个Map<String, StreamItem> streamMap2 = Stream.of(        new StreamItem(1, "k1"),        new StreamItem(2, "k2")).collect(Collectors.toMap(StreamItem::getKey, Function.identity()));//如果 key 重复报: java.lang.IllegalStateException: Duplicate keySystem.out.println(streamMap2);//输出:{k1=StreamItem{id=1, key='k1', name='i_1|k_k1'}, k2=StreamItem{id=2, key='k2', name='i_2|k_k2'}}

分组,在组内排序然后获取最大值,或者最小值4As28资讯网——每日最新资讯28at.com

Comparator<StreamItem> idComparator =Comparator.comparing(StreamItem::getId);Map<String, Optional<StreamItem>> streamMap3 = streamList.stream().collect(Collectors.groupingBy(StreamItem::getKey,                                                                Collectors.reducing(BinaryOperator.maxBy(idComparator))));System.out.println(streamMap3);//输出{k1=Optional[StreamItem{id=2, key='k1', name='i_2|k_k1'}], k2=Optional[StreamItem{id=4, key='k2', name='i_4|k_k2'}]}

List 转换为 List

这个也是超级实用的 api4As28资讯网——每日最新资讯28at.com

List<List<StreamItem>> partitionList = Lists.partition(streamList, 2);List<StreamItem> streamList1 = partitionList.stream().flatMap(Collection::stream).collect(Collectors.toList());System.out.println(streamList1);//输出[StreamItem{id=1, key='k1', name='i_1|k_k1'}, StreamItem{id=2, key='k1', name='i_2|k_k1'}, StreamItem{id=3, key='k2', name='i_3|k_k2'}, StreamItem{id=4, key='k2', name='i_4|k_k2'}]

排序

排序,默认正序,如果是需要倒序,可以在comparing 方法后面再调用 reversed 方法4As28资讯网——每日最新资讯28at.com

//3.1 正序List<StreamItem> streamList2 = Stream.of(    new StreamItem(3, "k1"),    new StreamItem(1, "k1"),    new StreamItem(2, "k2"))//倒序:Comparator.comparing(StreamItem::getId).reversed().sorted(Comparator.comparing(StreamItem::getId)).collect(Collectors.toList());System.out.println(streamList2);

去重

去重复后,保留最后写入的值4As28资讯网——每日最新资讯28at.com

//4.1 去重复List<StreamItem> streamList3 = Stream.of(    new StreamItem(3, "k1"),    new StreamItem(1, "k1"),    new StreamItem(2, "k2"))//如果只需要保留最大的 id 的值,就可以先排序, 时间复杂度考了个人觉得实用 group 更优.sorted(Comparator.comparing(StreamItem::getId).reversed()).collect(Collectors.collectingAndThen(Collectors.toCollection(() ->                                                              //利用 set 特征去重                                                              new TreeSet<>(Comparator.comparing(StreamItem::getKey))), ArrayList::new));System.out.println(streamList3);//输出:[StreamItem{id=3, key='k1', name='i_3|k_k1'}, StreamItem{id=2, key='k2', name='i_2|k_k2'}]

其他常用 API

  • filter(按照条件过滤需要数据)
  • max(取出流中的最大值)
  • min(取出流中的最小值)
  • count(取出流中的数量)
  • sum(取出流中数据的和)
  • average(取出流中数据的平均值)
  • distinct(将流中的数据去重)
  • sorted(自然排序,默认为升序,可以设置为升序排序或者降序排序)
  • limit,skip (限制和跳过:可以将流数据的部分截取,可用于后台的分页场景)
  • map(映射转换)
  • collect,toList(不可以对集合去重)
  • collect, toSet(可以集合去重)
  • toArray(将流数据转为数组)
  • mapToInt,distinct(将流数据转成IntStream,并去重)
  • reduce 求和
  • reduce 求最大值
  • reduce 求最小值
  • reduce 求乘积
  • findFirst(查找第一个元素)
  • findAny(任意查找一个元素)
  • allMatch(判断是否全部满足条件,全部满足返回 true,否则返回false)
  • anyMatch(判断是否有一个满足条件,只要有一个满足就返回 true,否则都不满足返回false)
  • noneMatch(判断是否都不满足条件,都不满足返回true,否则返回false)
  • flatmap(扁平化流处理)

本文链接:http://www.28at.com/showinfo-26-19904-0.html我们一起聊聊 Java Steam 常用 API

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 信贷系统中是如何使用征信数据?

下一篇: 使用LLama和ChatGPT为多聊天后端构建微服务

标签:
  • 热门焦点
  • 对标苹果的灵动岛 华为带来实况窗功能

    继苹果的灵动岛之后,华为也在今天正式推出了“实况窗”功能。据今天鸿蒙OS 4.0的现场演示显示,华为的实况窗可以更高效的展现出实时通知,比如锁屏上就能看到外卖、打车、银行
  • 5月iOS设备好评榜:iPhone 14仅排第43?

    来到新的一月,安兔兔的各个榜单又重新汇总了数据,像安卓阵营的榜单都有着比较大的变动,不过iOS由于设备的更新换代并没有那么快,所以相对来说变化并不大,特别是iOS好评榜,老款设
  • 十个可以手动编写的 JavaScript 数组 API

    JavaScript 中有很多API,使用得当,会很方便,省力不少。 你知道它的原理吗? 今天这篇文章,我们将对它们进行一次小总结。现在开始吧。1.forEach()forEach()用于遍历数组接收一参
  • 从 Pulsar Client 的原理到它的监控面板

    背景前段时间业务团队偶尔会碰到一些 Pulsar 使用的问题,比如消息阻塞不消费了、生产者消息发送缓慢等各种问题。虽然我们有个监控页面可以根据 topic 维度查看他的发送状态,
  • 19个 JavaScript 单行代码技巧,让你看起来像个专业人士

    今天这篇文章跟大家分享18个JS单行代码,你只需花几分钟时间,即可帮助您了解一些您可能不知道的 JS 知识,如果您已经知道了,就当作复习一下,古人云,温故而知新嘛。现在,我们就开始今
  • 破圈是B站头上的紧箍咒

    来源 | 光子星球撰文 | 吴坤谚编辑 | 吴先之每年的暑期档都少不了瞄准追剧女孩们的古偶剧集,2021年有优酷的《山河令》,2022年有爱奇艺的《苍兰诀》,今年却轮到小破站抓住了追
  • 签约井川里予、何丹彤,单视频点赞近千万,MCN黑马永恒文希快速崛起!

    来源:视听观察永恒文希传媒作为一家MCN公司,说起它的名字来,可能大家会觉得有点儿陌生,但是说出来下面一串的名字之后,或许大家就会感到震惊,原来这么多网红,都签约这家公司了。根
  • 8月见!小米MIX Fold 3获得3C认证:支持67W快充

    这段时间以来,包括三星、一加、荣耀等等有不少品牌旗下的最新折叠屏旗舰都得到了不少爆料,而小米新一代折叠屏旗舰——小米MIX Fold 3此前也屡屡被传
  • iQOO 11S评测:行业唯一的200W标准版旗舰

    【Techweb评测】去年底,iQOO推出了“电竞旗舰”iQOO 11系列,作为一款性能强机,该机不仅全球首发2K 144Hz E6全感屏,搭载了第二代骁龙8平台及144Hz电竞
Top