有条件地从Java 8中的List中删除元素

时间:2018-02-28 07:58:19

标签: java lambda collections java-8

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

HotelPriceSummary {
     Hotel hotel;
     float price
}

List<HotelPriceSummary> allHotels;

Iterable<Hotel> discardedHotels

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

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

1 个答案:

答案 0 :(得分:4)

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

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

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

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