在Java8中有条件地从列表中删除元素

在Java8中有条件地从列表中删除元素,java,lambda,collections,java-8,Java,Lambda,Collections,Java 8,据我所知,Java8引入了一种可用于集合类型的新方法:removeif()。它接受一个谓词,该谓词定义了删除元素的条件。它返回一个布尔值,其中true响应表示至少有一项已删除,否则为false: 我有这门课: HotelPriceSummary { Hotel hotel; float price } a列出所有酒店 和Iterable废弃酒店 我想做一些类似的事情(显然,existsIn是一个不存在的函数,是为了表达我想做的事情,但我没有找到方法) 无法在Iterable

据我所知,Java8引入了一种可用于集合类型的新方法:removeif()。它接受一个谓词,该谓词定义了删除元素的条件。它返回一个布尔值,其中true响应表示至少有一项已删除,否则为false: 我有这门课:

HotelPriceSummary {
     Hotel hotel;
     float price
}
a
列出所有酒店

Iterable废弃酒店

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


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


您可以从
discardedHotels
Iterable(假设
Hotel
覆盖等于和hashCode)生成
HashSet
,并使用
set.contains()
您可以通过使用
集合而不是
Iterable
来获得吗?使用
ArrayList.removeAll(集合c)
discardedHotels.forEach(h->allHotels.removeIf(hps->hps.getHotel().equals(h))
怎么样?我知道效率不是很高。@Harshit没有
ArrayList
,没有
Collection
,它们甚至不是相同的元素类型。可以通过
Set-discardedSet=StreamSupport.stream(discardedHotels.spliterator(),false)简化集合创建@Flown谢谢你的建议,但我不认为这是一种简化。
allHotels.removeIf(h -> h.getHotel().existsIn (discardedHotels))
Set<Hotel> discardedSet = new HashSet<>();
discardedHotels.forEach(discardedSet::add);
allHotels.removeIf(h -> discardedSet.contains(h.getHotel()));
discardedHotels.forEach(h -> allHotels.removeIf(hps -> hps.getHotel().equals(h)))