有条件地从 Java 8 中的列表中删除元素 [重复]

Posted

技术标签:

【中文标题】有条件地从 Java 8 中的列表中删除元素 [重复]【英文标题】:Conditionally remove elements from a List in Java 8 [duplicate] 【发布时间】:2018-08-08 00:54:44 【问题描述】:

据我所知,Java 8 引入了一种可用于 Collection 类型的新方法:removeif()。它接受一个谓词,该谓词定义应删除元素的条件。它返回一个布尔值,其中真正的响应意味着至少一个项目已被删除,否则为 false: 我有这门课:

HotelPriceSummary 
     Hotel hotel;
     float price

List<HotelPriceSummary> allHotels;

Iterable<Hotel> discardedHotels

我想做类似的事情(显然existsIn是一个不存在的函数,是表达我想做的但是我没有找到方法)

allHotels.removeIf(h -> h.getHotel().existsIn (discardedHotels))

【问题讨论】:

您可以从discardedHotels Iterable 生成HashSet(假设Hotel 覆盖equals 和hashCode)并使用set.contains() 你能用Collection代替Iterable吗?它会让这变得简单得多。 使用ArrayList.removeAll(Collection<?> c) discardedHotels.forEach(h -> allHotels.removeIf(hps -> hps.getHotel().equals(h))) 怎么样?效率不高,我知道。 @Harshit 没有ArrayList,没有Collection,它们甚至不是同一个元素类型。 【参考方案1】:

您无法有效地定位 Iterable 中的项目。我建议将它复制到一个临时集合(除非它已经是一个集合),然后调用contains()

Set<Hotel> discardedSet = new HashSet<>();
discardedHotels.forEach(discardedSet::add);
allHotels.removeIf(h -> discardedSet.contains(h.getHotel()));

如果您不介意 O(n*m) 复杂度,可以在 Iterable.forEach() 内调用 List.removeIf()

discardedHotels.forEach(h -> allHotels.removeIf(hps -> hps.getHotel().equals(h)))

【讨论】:

集创建可以通过Set&lt;Hotel&gt; discardedSet = StreamSupport.stream(discardedHotels.spliterator(), false).collect(Collectors.toSet());简化 @Flown 感谢您的建议,但我不认为这是一种简化。

以上是关于有条件地从 Java 8 中的列表中删除元素 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何有条件地从元组列表中删除元素?

如何正确地从有效载荷中添加和删除元素? (或有条件更换)

根据另一个列表中的条件删除一个列表中的某些元素

使用条件删除列表中的元素

Java 8 列表处理 - 有条件地添加元素

python数组中怎样删除符合条件的元素