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

我们一起聊聊 Java Steam 常用 API

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

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

分组

List 默认分组过后是 Map<Key, List>OC628资讯网——每日最新资讯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>OC628资讯网——每日最新资讯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'}}

分组,在组内排序然后获取最大值,或者最小值OC628资讯网——每日最新资讯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

这个也是超级实用的 apiOC628资讯网——每日最新资讯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 方法OC628资讯网——每日最新资讯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);

去重

去重复后,保留最后写入的值OC628资讯网——每日最新资讯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为多聊天后端构建微服务

标签:
  • 热门焦点
  • 小米降噪蓝牙耳机Necklace分享:听一首歌 读懂一个故事

    在今天下午的小米Civi 2新品发布会上,小米还带来了一款新的降噪蓝牙耳机Necklace,我们也在发布结束的第一时间给大家带来这款耳机的简单分享。现在大家能见到最多的蓝牙耳机
  • 5月安卓手机好评榜:魅族20 Pro夺冠

    性能榜和性价比榜之后,我们来看最后的安卓手机好评榜,数据来源安兔兔评测,收集时间2023年5月1日至5月31日,仅限国内市场。第一名:魅族20 Pro好评率:97.50%不得不感慨魅族老品牌还
  • 摸鱼心法第一章——和配置文件说拜拜

    为了能摸鱼我们团队做了容器化,但是带来的问题是服务配置文件很麻烦,然后大家在群里进行了“亲切友好”的沟通图片图片图片图片对比就对比,简单对比下独立配置中心和k8s作为配
  • .NET 程序的 GDI 句柄泄露的再反思

    一、背景1. 讲故事上个月我写过一篇 如何洞察 C# 程序的 GDI 句柄泄露 文章,当时用的是 GDIView + WinDbg 把问题搞定,前者用来定位泄露资源,后者用来定位泄露代码,后面有朋友反
  • 腾讯盖楼,字节拆墙

    来源 | 光子星球撰文 | 吴坤谚编辑 | 吴先之&ldquo;想重温暴刷深渊、30+技能搭配暴搓到爽的游戏体验吗?一起上晶核,即刻暴打!&rdquo;曾凭借直播腾讯旗下代理格斗游戏《DNF》一
  • 一条抖音4亿人围观 ! 这家MCN比无忧传媒还野

    作者:Hiu 来源:互联网品牌官01 擦边少女空降热搜,幕后推手曝光被网友誉为&ldquo;纯欲天花板&rdquo;的女网红井川里予,近期因为一组哥特风照片登上热搜,引发了一场互联网世界关于
  • 重估百度丨大模型,能撑起百度的“今天”吗?

    自象限原创 作者|程心 罗辑2023年之前,对于自己的&ldquo;今天&rdquo;,百度也很迷茫。&ldquo;新业务到 2022 年底还是 0,希望 2023 年出来一个 1。&rdquo;这是2022年底,李彦宏
  • 网传小米汽车开始筛选交付中心 建筑面积不低于3000平方米

    7月7日消息,近日有微博网友@长三角行健者爆料称,据经销商集团反馈,小米汽车目前已经开始了交付中心的筛选工作,要求候选场地至少有120个车位,建筑不能低
  • 机构称Q2国内智能手机销量同比下滑4% vivo份额重回第1

    7月29日消息,根据市场调查机构Counterpoint Research公布的最新报告,2023年第2季度中国智能手机销量同比下降4%,创新自2014年以来第2季度销量新低。报
Top