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

Nuñ*_*ada 0 java collections lambda java-8

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

HotelPriceSummary {
     Hotel hotel;
     float price
}
Run Code Online (Sandbox Code Playgroud)

一种 List<HotelPriceSummary> allHotels;

Iterable<Hotel> discardedHotels

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

allHotels.removeIf(h -> h.getHotel().existsIn (discardedHotels))
Run Code Online (Sandbox Code Playgroud)

shm*_*sel 5

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

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

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

discardedHotels.forEach(h -> allHotels.removeIf(hps -> hps.getHotel().equals(h)))
Run Code Online (Sandbox Code Playgroud)

  • @Flown感谢您的建议,但我不认为这是一种简化。 (2认同)