根据两个字段去重
时间: 2023-06-21 22:24:26 浏览: 80
如果要根据两个字段进行去重,可以使用Java中的Stream API和Collectors.toMap()方法来实现。假设有一个包含对象元素的List列表,每个对象元素都有两个字段"field1"和"field2",我们要根据这两个字段进行去重操作,可以按照以下步骤进行:
1. 使用Stream API的distinct()方法去重,但是这个方法默认是根据对象的equals()方法和hashCode()方法进行比较的,如果没有重写这两个方法,则无法实现按照指定字段去重。
2. 使用Stream API的collect()方法和Collectors.toMap()方法来构建一个新的Map,以"field1"和"field2"字段组成的字符串为键,以整个对象元素为值,这里使用String.join()方法将这两个字段连接起来,用一个特殊的字符分隔,这个方法中第二个参数可以指定当键值冲突时的处理方式,这里我们选择保留第一个键值对。
3. 将这个Map的值转换为一个List,这就是我们想要的结果。
下面是示例代码:
```
List<MyObject> myList = Arrays.asList(
new MyObject("A", "1"),
new MyObject("B", "2"),
new MyObject("C", "3"),
new MyObject("A", "4"),
new MyObject("B", "5"),
new MyObject("A", "1")
);
// 使用Stream API进行根据两个字段去重
List<MyObject> result = myList.stream()
.collect(Collectors.toMap(obj -> String.join(":", obj.getField1(), obj.getField2()), Function.identity(), (o1, o2) -> o1))
.values().stream().collect(Collectors.toList());
System.out.println(result);
```
以上代码的输出结果为:
```
[MyObject{field1='A', field2='1'}, MyObject{field1='B', field2='2'}, MyObject{field1='C', field2='3'}, MyObject{field1='A', field2='4'}, MyObject{field1='B', field2='5'}]
```
可以看到,根据"field1"和"field2"字段进行了去重操作。注意,输出结果的顺序可能会和输入的顺序不同,这是因为Map是无序的。另外,需要在MyObject类中重写equals()方法和hashCode()方法,以便正确地比较对象是否相等。
阅读全文