此问题在此处已有答案:
Java 8 Distinct by property(34个答案)
三年前关闭了。
我正尝试从基于某些属性的对象列表中删除重复项。
我们能用Java8以一种简单的方式做到吗
List<Employee> employee
我们能不能根据雇员的id
属性删除重复的字符串?我看到过从字符串数组列表中删除重复字符串的帖子。
此问题在此处已有答案:
Java 8 Distinct by property(34个答案)
三年前关闭了。
我正尝试从基于某些属性的对象列表中删除重复项。
我们能用Java8以一种简单的方式做到吗
List<Employee> employee
我们能不能根据雇员的id
属性删除重复的字符串?我看到过从字符串数组列表中删除重复字符串的帖子。
9条答案
按热度按时间3qpi33ja1#
您可以从
List
中获取一个流,并将其放入TreeSet
中,从中提供一个定制的比较器,用于唯一地比较id。如果你真的需要一个列表你可以把这个集合放回数组列表中.
举个例子:
它将输出:
另一个想法是使用一个 Package 器来 Package 一个雇员,并使用基于其id的equals和hashcode方法:
然后 Package 每个示例,调用
distinct()
,展开它们并将结果收集到一个列表中。实际上,我认为可以通过提供一个执行比较的函数来使这个 Package 器通用:
并且Map将是:
4xrmg8kj2#
直接在列表中执行此操作的最简单方法是
removeIf
将删除满足指定条件的元素Set.add
未修改Set
,即已包含值,则Set.add
将返回false
当然,只有当列表支持移除元素时,它才起作用。
g6baxovj3#
如果你可以使用
equals
,那么就在流中使用distinct
来过滤列表(见上面的答案)。如果你不能或者不想覆盖equals
方法,你可以用下面的方法对任何属性filter
流,例如属性Name(属性Id等也是一样):vvppvyoh4#
另一个解决方案是使用 predicate ,然后您可以在任何过滤器中使用它:
然后只需在任何地方重用 predicate :
注意:在filter的JavaDoc中,它说它接受一个无状态的Predict。实际上,即使流是并行的,它也能很好地工作。
关于其他解决方案:
1)使用
.collect(Collectors.toConcurrentMap(..)).values()
是一个很好的解决方案,但是如果您想排序并保持顺序,那么它会很烦人。2)
stream.removeIf(e->!seen.add(e.getID()));
也是一个很好的解决方案,但是我们需要确保集合实现了removeIf,例如如果我们使用Arrays.asList(..)
构造集合,它会抛出异常。iq3niunx5#
请尝试以下代码:
6ojccjat6#
这对我很有效:
当然,您需要实现equals
lmvvr0a87#
如果顺序无关紧要,并且并行运行性能更高,请Collect to a Map,然后获取值:
az31mfrm8#
这里有很多很好的答案,但是我没有找到关于使用
reduce
方法的答案。因此,对于您的情况,您可以通过以下方式应用它:nkhmeac69#
另一个版本很简单