我正在尝试使用java lambda表达式删除重复项,而无需使用distinct。
这是我的解决方案:
public static List<Integer> dropDuplicates(List<Integer> list) {
return list
.stream()
.collect(Collectors.groupingBy(Function.identity()))
.values()
.stream()
.map(v -> v.stream().findFirst().get())
.collect(toList());
}
它工作正常,但是元素的顺序已更改。
List<Integer> list = Arrays.asList(11, 12, 1, 2, 2, 3,12, 4, 13, 4, 13);
output => [1, 2, 3, 4, 11, 12, 13]
我对Java函数编程有点陌生(也许这是愚蠢的问题)。有什么方法可以保留列表元素的顺序或其他更好的方法吗?
您的问题来自于Map界面在元素顺序方面没有任何保证的事实。如果您关心订单,则需要确保使用了有序的实现(例如LinkedHashMap
)。以下实现保留了该顺序:
public static List<Integer> dropDuplicates(List<Integer> list) {
return list
.stream()
.collect(Collectors.groupingBy(Function.identity(), LinkedHashMap::new, Collectors.toList()))
.values()
.stream()
.map(v -> v.stream().findFirst().get())
.collect(Collectors.toList());
}
当然,使用distinct()
或欧内斯特建议的方法将是一种更简单的解决方案。只是想以您到目前为止所做的为基础。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句