java8的Stream通过条件合并两个List

 


@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);
}

 

Java 8中,你可以使用Stream API来实现两个`List<Bean>`的去重合并。这里有几种常见的方法来完成这个任务,其中一种是使用`Stream`和`Collectors.toSet()`来去除重复的元素,然后合并两个列表。另一个方法是使用`Stream`的`distinct()`方法来去除重复元素,然后通过`collect(Collectors.toList())`将结果收集回`List`。 以下是使用`Stream`和`Collectors.toSet()`方法合并两个列表并去除重复项的示例代码: ```java List<Bean> list1 = ...; // 第一个List<Bean> List<Bean> list2 = ...; // 第二个List<Bean> // 使用stream两个列表合并,并通过Collectors.toSet()去除重复项 List<Bean> distinctList = Stream.concat(list1.stream(), list2.stream()) .collect(Collectors.toSet()) .stream().collect(Collectors.toList()); ``` 这里假设`Bean`类已经正确重写了`equals()`和`hashCode()`方法,这样`Collectors.toSet()`才能正确识别重复的`Bean`实例。如果没有重写这两个方法,你需要提供一个自定义的比较器给`Collectors.toCollection()`方法。 以下是使用`distinct()`方法合并两个列表并去除重复项的示例代码: ```java List<Bean> list1 = ...; // 第一个List<Bean> List<Bean> list2 = ...; // 第二个List<Bean> // 使用stream两个列表合并,然后使用distinct()去除重复项 List<Bean> distinctList = Stream.of(list1, list2) .flatMap(List::stream) .distinct() .collect(Collectors.toList()); ``` 使用`distinct()`方法同样假设`Bean`类已经正确实现了`equals()`和`hashCode()`方法。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值