如何直接根据值过滤集合?

时间:2019-01-04 19:17:51

标签: java lambda java-8 filtering

我想知道如何从包含特定值的集合中获取所有元素。

赞:

list.removeIf(c -> c.getCarColor() == Color.BLUE);

但是我想直接过滤集合。我读到可以使用LAMBDA做到这一点,例如:

driver.find_element_by_css_selector("a[title*='Permalink']")

但是我不知道如何应用这个例子。

谢谢。

2 个答案:

答案 0 :(得分:7)

使用流和filter

salesList.stream()
         .filter(sale -> sale.getMap().equals(mapName)) // I've changed map to mapName as I am assuming that was a mistake
         .collect(Collectors.toCollection(HashSet::new));

保留满足提供的谓词sale -> sale.getMap().equals(mapName)的元素

请注意,以上不会进行修改,如果您想修改源,请继续执行removeIf

salesList.removeIf(sale -> !sale.getMap().equals(mapName));

删除了满足所提供谓词sale -> !sale.getMap().equals(mapName)的元素

答案 1 :(得分:4)

从方法名selectSales来看,您不想从原始列表中删除条目,而是想要构造一个新集合,从源中复制元素并按条件过滤掉某些值。

条件为sale.getMap().equals(mapName)。请注意,我使用的是mapName而不是map,这似乎是一个错字。

salesList.stream()
         .filter(sale -> sale.getMap().equals(mapName))
         .collect(Collectors.toList());

假设salesList不是null,则该方法的更强大版本看起来像

public Collection<Sale> selectSales(String mapName) {
    Objects.requireNonNull(mapName, "mapName");

    return salesList.stream()
             .filter(sale -> mapName.equals(sale.getMap()))
             .collect(Collectors.toList());
}