首页 > 编程语言 >Java8 Stream流的合并

Java8 Stream流的合并

时间:2023-05-05 23:12:57浏览次数:40  
标签:Customer map flatMap Stream stream 合并 customerList Java8

最近的需求里有这样一个场景,要校验一个集合中每个对象的多个Id的有效性。比如一个Customer对象,有3个Id:id1id2id3,要把这些Id全部取出来,然后去数据库里查询它是否存在。

@Data
@AllArgsConstructor
public class Customer {
    private String name;
    private String id1;
    private String id2;
    private String id3;
}

在通常情况下,我们要从集合中取出一个对象属性,很好办,用这个办法:

customerList.stream().map(Customer::getId1).filter(Objects::nonNull).collect(Collectors.toList())

现在要取3个字段,怎么做呢?

Stream.concat

Stream接口中的静态方法concat,可以把两个流合成一个,我们取3个字段可以合并两次:

Stream<String> concat = Stream.concat(customerList.stream().map(Customer::getId1),
		customerList.stream().map(Customer::getId2));
List<String> ids = Stream.concat(concat, customerList.stream().map(Customer::getId3))
        .filter(Objects::nonNull)
        .collect(Collectors.toList());

取4个字段,就再继续合并。但是这种不够简洁,可以使用扁平化流flatMap。

flatMap

flatmap方法让你把一个流中的每个值都换成另一个流,然后把所有的流连接起来成为一个流。

Stream.flatMap方法的入参为一个Function函数,函数返回值的泛型要求为Stream类型。对比一下,mapflatMap都是将流中的元素映射为我们想要的值,只是flatMap映射的结果是一个新的Stream。

Stream.of方法刚好可以构建一个类型为Stream的原始流,以供flatMap操作。

List<String> ids = Stream.of(customerList.stream().map(Customer::getId1),
                             customerList.stream().map(Customer::getId2),
                             customerList.stream().map(Customer::getId3))
        .flatMap(idStream -> idStream)
        .filter(Objects::nonNull)
        .collect(Collectors.toList());

注意,Stream.of方法返回的流的泛型跟方法入参的类型是一样,上面的代码就相当于,Stream.of(stream, stream, stream), 得到的结果就是Stream<Stream>,紧接着用flatMap扁平化处理,把每一个元素合成一个新流。

标签:Customer,map,flatMap,Stream,stream,合并,customerList,Java8
From: https://www.cnblogs.com/cloudrich/p/17375636.html

相关文章

  • JAVA8新特性
    JAVA8新特性Lambda表达式只有函数式接口才能使用Lambda表达式​ Lambda表达式是JDK8中的一个语法糖,它可以对某些匿名内部类的写法进行简化,它是函数式编程思想的一个重要体现,让我们不用关注是什么对象,而是更关注我们对数据进行了什么操作。核心原则​ 可推导可省略基本格......
  • gstreamer使用rtsp服务器
    目录将videotestsrc推送为rtsp链接教程网址https://gist.github.com/hum4n0id/2760d987a5a4b68c24256edd9db6b42b#stream-web-camjetson-nano将videotestsrc推送为rtsp链接先安装开发环境#installgst-rtsp-serverlibssudoapt-getinstalllibgstrtspserver-1.0libgstr......
  • Python+Pandas批量合并大量excel文件
    requirments.txtet-xmlfile==1.1.0numpy==1.24.3openpyxl==3.1.2pandas==2.0.1python-dateutil==2.8.2pytz==2023.3six==1.16.0tzdata==2023.3main.pyimportosimportpandasaspddir_path=os.path.dirname(os.path.abspath(__file__))source_location=o......
  • Java8之UnaryOperator总结
    在Java8中,UnaryOperator是一个参数接口,它继承自Function,UnaryOperator接收一个参数,返回和参数同样类型的结果,其实相当于对数据做了加工。@FunctionalInterfacepublicinterfaceUnaryOperator<T>extendsFunction<T,T>{}UnaryOperator作为参数importjava.util.Array......
  • 二次开发项目之合并项目代码
    二次开发项目,并需要不时的接收外部的bug修复代码,合并起来其实停头疼的一方面是自己在上之上开发了不少新功能,与其原公司的代码相当于走在了2条路上另一方面是其原公司还在维护修复反馈的bug,就导致每次给的patch和code,都需要仔细核对一遍(存在给patch和code对不上的问题......
  • C# iTextSharp,将多张图片合并生成PDF文件
    1、添加引用首先添加NuGet引用 2、界面实现及按钮事件///<summary>///根据图片生成PDF///</summary>///<paramname="sender"></param>///<paramname="e"></param>privatev......
  • 合并两个排序的链表
    描述输入两个递增的链表,单个链表的长度为n,合并这两个链表并使新链表中的节点仍然是递增排序的。 数据范围: 0≤n≤1000,−1000≤节点值≤1000要求:空间复杂度 O(1),时间复杂度 O(n) 如输入{1,3,5},{2,4,6}时,合并后的链表为{1,2,3,4,5,6},所以对应的输出为{1,2,3,4,5,6} ......
  • JAVA8新特性
    JAVA8新特性Lambda表达式只有函数式接口才能使用Lambda表达式​ Lambda表达式是JDK8中的一个语法糖,它可以对某些匿名内部类的写法进行简化,它是函数式编程思想的一个重要体现,让我们不用关注是什么对象,而是更关注我们对数据进行了什么操作。核心原则​ 可推导可省略基本格......
  • java8新特性理解
    一些关于java8新特性理解引例在java中,考虑实现按学号顺序对学生List进行排序的功能。一.java8以前的实现方式:匿名内部类如果不使用java8的新特性,我们实现该功能通常会使用匿名内部类的方法。importjava.util.*;;classStudent{privateintid;privateStringn......
  • python字典合并
    两个Python字典可以通过多种方式进行合并:使用update()方法:使用update()方法将一个字典中的键值对添加到另一个字典中,如果存在相同的键,则更新对应的值。dict1={'a':1,'b':2}dict2={'b':3,'c':4}dict1.update(dict2)print(dict1)#输出{'a':1,'b'......