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

标签 java lambda collections java-8

据我所知,Java 8 引入了一个可用于 Collection 类型的新方法:removeif()。它接受一个谓词,该谓词定义了应删除元素的条件。它返回一个 boolean 值,其中 true 响应意味着至少有一项已被删除,否则为 false: 我有这门课:

HotelPriceSummary {
     Hotel hotel;
     float price
}

一个List<HotelPriceSummary> allHotels;

Iterable<Hotel> discardedHotels

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

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

最佳答案

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

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

如果您不介意 O(n*m) 复杂度,可以在 Iterable.forEach() 中调用 List.removeIf():

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

关于java - 有条件地从 Java 8 中的列表中删除元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49024564/

相关文章:

java - Apache Nutch - 路径问题

java - 如何在 Java EE 6 上使用 Entity.xml,或者等效项是什么

c++ - 如何在 Boost.Lambda 中使用 <cmath> 中的函数?

java - 为什么 arrayList 没有迭代最后一个元素?

php - 如何通过选择下拉属性过滤 magento 集合?

c# - StringDictionary 类和 Dictionary<String,String> 之间有区别吗

java - 如何对返回 Java 字符串的方法进行单元测试?

java - 关闭 SAXParserFactory 的验证

python - 如何用pandas中的条件替换两列?

Java 8 - 匿名类和 lambda 函数之间明显的不一致