关于lambda:有条件地从Java 8中的List中删除元素

Conditionally remove elements from a List in Java 8

本问题已经有最佳答案,请猛点这里访问。

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

1
2
3
4
HotelPriceSummary {
     Hotel hotel;
     float price
}

List allHotels;

Iterable discardedHotels

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

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


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

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

如果您不介意O(N*M)复杂性,可以在Iterable.forEach()中调用List.removeIf()

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