Java List<ShenTongMain> 使用distinct更具id去重两个listOne和listTwo 当两个list中同时出现id = 1 的数据时,保留那个list中的数据?
时间: 2023-10-05 07:13:50 浏览: 52
Java中的`distinct`方法是用于去除一个集合中的重复元素的,不涉及根据某个属性去重的问题。如果你想根据`id`属性去重两个列表,并且保留指定的列表中的数据,可以使用Java 8的流式处理和Lambda表达式来实现。具体地,可以先将两个列表合并成一个列表,然后按照`id`属性进行分组,并使用`collect`方法将分组后的结果转换为列表。对于分组后的每个组,可以通过判断该组是否包含指定的列表来决定保留哪个元素。示例如下:
```java
List<ShenTongMain> listOne = Arrays.asList(
new ShenTongMain(1, "a"),
new ShenTongMain(2, "b"),
new ShenTongMain(3, "c")
);
List<ShenTongMain> listTwo = Arrays.asList(
new ShenTongMain(1, "d"),
new ShenTongMain(4, "e"),
new ShenTongMain(5, "f")
);
List<ShenTongMain> mergedList = new ArrayList<>(listOne);
mergedList.addAll(listTwo);
List<ShenTongMain> distinctList = mergedList.stream()
.collect(Collectors.groupingBy(ShenTongMain::getId))
.values().stream()
.map(group -> group.stream()
.filter(item -> listOne.contains(item))
.findFirst().orElse(group.get(0)))
.collect(Collectors.toList());
System.out.println(distinctList); // 输出:[ShenTongMain{id=1, name='a'}, ShenTongMain{id=2, name='b'}, ShenTongMain{id=3, name='c'}, ShenTongMain{id=4, name='e'}, ShenTongMain{id=5, name='f'}]
```
在这个例子中,我们将两个列表合并成一个`mergedList`,然后按照`id`属性进行分组,再对每个分组进行处理,首先使用`filter`方法过滤出包含在`listOne`中的元素,如果有则保留该元素,否则保留该分组中的第一个元素。最后将处理后的元素收集到一个新列表中。注意,这里的`ShenTongMain`类需要实现相应的`equals`和`hashCode`方法,以便在使用`contains`方法时能够正确地比较对象。