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

我们一起聊聊 Java Steam 常用 API

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

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

分组

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

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

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

去重

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

标签:
  • 热门焦点
  • MIX Fold3包装盒泄露 新机本月登场

    小米的全新折叠屏旗舰MIX Fold3将于本月发布,近日该机的真机包装盒在网上泄露。从图上来看,新的MIX Fold3包装盒在外观设计方面延续了之前的方案,变化不大,这也是目前小米旗舰
  • 7月安卓手机性能榜:红魔8S Pro再夺榜首

    7月份的手机市场风平浪静,除了红魔和努比亚带来了两款搭载骁龙8Gen2领先版处理器的新机之外,别的也想不到有什么新品了,这也正常,通常6月7月都是手机厂商修整的时间,进入8月份之
  • iPhone卖不动了!苹果股价创年内最大日跌幅:市值一夜蒸发万亿元

    8月5日消息,今天凌晨美股三大指数高开低走集体收跌,道指跌0.41%;纳指跌0.36%;标普500指数跌0.52%。热门科技股也都变化极大,其中苹果报181.99美元,跌4.8%,创
  • 一年经验在二线城市面试后端的经验分享

    忠告这篇文章只适合2年内工作经验、甚至没有工作经验的朋友阅读。如果你是2年以上工作经验,请果断划走,对你没啥帮助~主人公这篇文章内容来自 「升职加薪」星球星友 的投稿,坐
  • 使用LLM插件从命令行访问Llama 2

    最近的一个大新闻是Meta AI推出了新的开源授权的大型语言模型Llama 2。这是一项非常重要的进展:Llama 2可免费用于研究和商业用途。(几小时前,swyy发现它已从LLaMA 2更名为Lla
  • 阿里大调整

    来源:产品刘有媒体报道称,近期淘宝天猫集团启动了近年来最大的人力制度改革,涉及员工绩效、层级体系等多个核心事项,目前已形成一个初步的&ldquo;征求意见版&rdquo;:1、取消P序列
  • 2纳米决战2025

    集微网报道 从三强争霸到四雄逐鹿,2nm的厮杀声已然隐约传来。无论是老牌劲旅台积电、三星,还是誓言重回先进制程领先地位的英特尔,甚至初成立不久的新
  • 苹果公司要求三星和LG Display生产「无边框」OLED iPhone显示屏

    据 The Elec 报道,苹果已要求其供应商为未来的 iPhone 型号开发「无边框」OLED 显示面板。苹果显然已要求三星和 LG Display 开发新的 OLED 显示面
  • “买真退假” 这种“羊毛”不能薅

    □ 法治日报 记者 王春   □ 本报通讯员 胡佳丽  2020年初,还在上大学的小东加入了一个大学生兼职QQ群。群主&ldquo;七王&rdquo;在群里介绍一些刷单赚
Top