Java lambda 表达式过滤器问题

Java lambda expression filter issue

我需要从哈希图中的列表中删除一些元素。老办法行得通。新方法行不通,似乎不删除请求的元素。

以旧方式登录我从未像预期的那样获得“find after!”。通过新方式,我获得了一些“追寻!” :(

旧方法:

workingMarketCards.forEach((k, v) -> {
    for (FixedPriceInsertion fpi : v) {
        if (fpi.getMasterId() == oc.getMasterCardId()) {
            System.out.println("found before!");
        }
    }
    ArrayList<FixedPriceInsertion> toBeRemoved = new ArrayList<>();
    for (FixedPriceInsertion fpi : v) {
        if (fpi.getMasterId() == (long) (oc.getMasterCardId())) {
            toBeRemoved.add(fpi);
        }
    }
   
    for (FixedPriceInsertion fpi : toBeRemoved) {
        v.remove(fpi);
    }
    for (FixedPriceInsertion fpi : v) {
        if (fpi.getMasterId() == oc.getMasterCardId()) {
            System.out.println("found after!");
        }
    }
});

新方式:

workingMarketCards.forEach((k, v) -> {
    for (FixedPriceInsertion fpi : v) {
        if (fpi.getMasterId() == oc.getMasterCardId()) {
            System.out.println("found before!");
        }
    }
    v.stream().filter(s -> s.getMasterId() == (long) (oc.getMasterCardId()));
    for (FixedPriceInsertion fpi : v) {
        if (fpi.getMasterId() == oc.getMasterCardId()) {
            System.out.println("found after!");
        }
    }
});

为什么?我的代码有什么问题?

你想要removeIf():

v.removeIf(s -> s.getMasterId() == (long) (oc.getMasterCardId()));

v.stream().filter()v 没有任何作用;它只影响从 v.

生成的元素流

不清楚什么类型 getMasterId() returns,但建议使用 == 来比较原始类型以外的东西;比较对象时总是使用 .equals()

过滤器不会修改变量 s 中的值。它只将过滤后的流发送到下一个链方法,因为在那之后你没有任何东西,所以它不会做任何事情。

您需要做的是使用过滤器删除值并收集它们。

ArrayList<FixedPriceInsertion> v2 = v.stream()
                        .filter(s -> s.getMasterId() != (long) (oc.getMasterCardId()))
                        .collect(Collectors.toList());