我有一个对象的集合。我只需在输出处留下一个字段具有唯一值的对象集合。
我写了一个解决方案,但也许有更优雅的东西,没有地图。
这是 Load 对象的集合。我最终需要得到一个具有独特 S 值的集合。“1”、“2”、“3”。保留哪些重复值并不重要。
List<Load> file = new ArrayList<>(
Arrays.asList(new Load(1, "1"), new Load(2, "2"), new Load(3, "3"), new Load(4, "3"), new Load(4, "3"), new Load(6, "3")));
public void filter() {
Set<Load> fileSet = new HashSet<>(file);
Map<String, Load> keySet = new HashMap<>();
file.forEach(e -> keySet.put(e.getS(), e));
System.out.println(keySet.values());
}
}
class Load {
int i;
String s;
}
在所提出的解决方案中,源列表中的最后一个元素将始终写入映射,即结果将为
[Load(1, "1"), Load(2, "2"), Load(6, "3")]
。此外,该方法
filter
不使用 setfileSet
。一般来说,要以某种方式过滤掉重复项,您必须使用映射,但这可以使用收集器“隐式”实现,
Collectors.toMap
这里合并函数定义特别重要:例如:
(v1, v2) -> v1
-- 只选择第一个元素Load(3, "3")
(v1, v2) -> v2
-- 只选择最后一个元素Load(6, "3")
(v1, v2) -> Math.random() < 0.5 ? v1 : v2
-- 随机元素选择