Java8 Stream使用flatMap合并List

这篇博客演示了Java中Map与List的交互操作,包括交集、并集、差集的实现,并展示了如何使用flatMap进行复杂的数据转换。示例中展示了将两个List合并及根据ID连接Data1和Data2列表为OutputData的过程。此外,还展示了flatMapToInt的用法,用于将多层List转换为IntStream并求和。
摘要由CSDN通过智能技术生成
 @Test
    public void mergeMapValuesTest(){
    Map<Integer, ListContainer> map = Maps.newHashMap();
    List<AClass> aClassList1 = Lists.newArrayList();
    AClass aClass = new AClass(1, "zhuoli1", "haha1");
    aClassList1.add(aClass);
    aClassList1.add(new AClass(2, "zhuoli2", "haha2"));
    aClassList1.add(new AClass(3, "zhuoli3", "haha3"));
 
    List<AClass> aClassList2 = Lists.newArrayList();
    aClassList2.add(aClass);
    aClassList2.add(new AClass(5, "zhuoli5", "haha5"));
    aClassList2.add(new AClass(6, "zhuoli6", "haha6"));
 
    /*交集*/
    /*[AClass(id=1, name=zhuoli1, description=haha1)]*/
    List<AClass> intersectResult = aClassList1.stream().filter(aClassList2::contains).collect(Collectors.toList());
    System.out.println(intersectResult);
 
    /*并集*/
    List<AClass> unionResult = Stream.of(aClassList1, aClassList2).flatMap(Collection::stream).distinct().collect(Collectors.toList());
    assertEquals(unionResult.size(), 5);
    System.out.println(unionResult);
 
    /*差集*/
    /*[AClass(id=2, name=zhuoli2, description=haha2), AClass(id=3, name=zhuoli3, description=haha3)]*/
    List<AClass> differenceResult = aClassList1.stream().filter(x -> !aClassList2.contains(x)).collect(Collectors.toList());
    System.out.println(differenceResult);
 
    map.put(1, new ListContainer(aClassList1));
    map.put(2, new ListContainer(aClassList2));
 
    /*合并多个list*/
    List<AClass> aClassListResult = map.values().stream().flatMap(listContainer -> listContainer.getLst().stream()).collect(Collectors.toList());
    /*注意跟并集的区别*/
    assertEquals(aClassListResult.size(), 6);
    System.out.println(aClassListResult);
    }
    flatMap的复杂操作,实现List<Data1>和List<Data2>根据Id进行连接,将连接结果输出为一个List<OutputData>:

    @Data
    @AllArgsConstructor
    public class Data1 {
    private int id;
    private String name;
    private int amount;
    }
 
    @Data
    @AllArgsConstructor
    public class Data2 {
    private int id;
    private String name;
    private String type;
    }
 
    @Data
    @AllArgsConstructor
    public class OutputData {
    private int id;
    private String name;
    private String type;
    private int amount;
    }
 
         
    @Test
    public void intersectByKeyTest(){
    List<Data2> listOfData2 = new ArrayList<Data2>();
 
    listOfData2.add(new Data2(10501, "JOE"  , "Type1"));
    listOfData2.add(new Data2(10603, "SAL"  , "Type5"));
    listOfData2.add(new Data2(40514, "PETER", "Type4"));
    listOfData2.add(new Data2(59562, "JIM"  , "Type2"));
    listOfData2.add(new Data2(29415, "BOB"  , "Type1"));
    listOfData2.add(new Data2(61812, "JOE"  , "Type9"));
    listOfData2.add(new Data2(98432, "JOE"  , "Type7"));
    listOfData2.add(new Data2(62556, "JEFF" , "Type1"));
    listOfData2.add(new Data2(10599, "TOM"  , "Type4"));
 
 
    List<Data1> listOfData1 = new ArrayList<Data1>();
 
    listOfData1.add(new Data1(10501, "JOE"    ,3000000));
    listOfData1.add(new Data1(10603, "SAL"    ,6225000));
    listOfData1.add(new Data1(40514, "PETER"  ,2005000));
    listOfData1.add(new Data1(59562, "JIM"    ,3000000));
    listOfData1.add(new Data1(29415, "BOB"    ,3000000));
 
    List<OutputData> result = listOfData1.stream()
            .flatMap(x -> listOfData2.stream()
                                    .filter(y -> x.getId() == y.getId())
                    .map(y -> new OutputData(y.getId(), x.getName(), y.getType(), x.getAmount())))
            .collect(Collectors.toList());
    System.out.println(result);
 
    /*difference by key*/
    List<Data1> data1IntersectResult = listOfData1.stream().filter(data1 -> listOfData2.stream().map(Data2::getId).collect(Collectors.toList()).contains(data1.getId())).collect(Collectors.toList());
    System.out.println(data1IntersectResult);
    }


    faltMapToInt用法

    @Test
    public void flatMapToIntTest() {
    List<List<String>> listOfLists = Arrays.asList(
                            Arrays.asList("1", "2"),
                            Arrays.asList("5", "6"),
                            Arrays.asList("3", "4")
                    );
 
    IntStream intStream =
            listOfLists.stream()
                    .flatMapToInt(childList ->
                                            childList.stream()
                                                    .mapToInt(Integer::new));
 
    int sum = intStream.peek(System.out::println).sum();
    System.out.println("sum: " + sum);
    }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

《小书生》

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值