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