【问题标题】:Java lambda expression filter issueJava lambda 表达式过滤器问题
【发布时间】:2020-09-10 17:20:51
【问题描述】:

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

以旧方式登录我从来没有得到“查找后!”,正如预期的那样。通过新方式,我获得了一些“追寻!” :(

老办法:

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!");
        }
    }
});

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

【问题讨论】:

  • .filter() 不会从列表中删除项目,它“返回一个由该流中与给定谓词匹配的元素组成的流”。看.removeIf()
  • 在比较对象时也使用.equals()而不是==

标签: java arraylist lambda hashmap


【解决方案1】:

你想要removeIf():

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

v.stream().filter()v 没有任何作用;它只影响从v 生成的元素流。


目前尚不清楚getMasterId() 返回什么类型,但建议谨慎使用== 比较原始类型以外的内容;比较对象时始终使用.equals()

【讨论】:

  • .equals() 是一个很好的观点,这是一个示例代码来理解 java lambda 表达式而不是生产代码。谢谢。
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 2018-06-07
    • 2020-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多