【问题标题】:Java 8, compare two maps and return resultJava 8,比较两张地图并返回结果
【发布时间】:2019-03-16 04:41:06
【问题描述】:

我正在比较 2 个地图使用 Java 8 功能,并根据条件想要返回结果。使用 .forEach 显示编译时错误,基本上,返回是从 Lambda 表达式返回,而不是从循环返回。如何从包含 lambda 的循环中返回?
请注意,我不是在比较两个地图对象的相等性

nMap.forEach((k,v) -> {
    if (!mMap.containsKey(k) || mMap.get(k) < v) {
        return -1;
    }
});

【问题讨论】:

  • 将完整代码与循环一起发布
  • foreach 方法接受了Comsumer。这意味着void方法。你可以在里面返回。
  • 这是完整的循环代码!
  • forEach(..) 具有消费者类型的参数。消费者接口有抽象方法( void accept(...).. 所以简而言之,你的 lambda 不应该从那里返回任何东西。
  • Comparing two maps的可能重复

标签: java lambda foreach java-8 java-stream


【解决方案1】:

使用Stream 的另一种方法根据给定条件过滤条目。流式传输的结果是一个Optional,其中可能包含一个找到的Entry

if (nMap.entrySet().stream()
        .filter(e -> !mMap.containsKey(e.getKey()) || mMap.get(e.getKey()) < e.getValue())
        .findAny()
        .isPresent()) {
    return -1;
}

【讨论】:

  • @Federico Peralta Schaffner 感谢您发现这一点。
【解决方案2】:

使用entrySet()anyMatch 中的Stream 代替forEach

boolean found = 
    nMap.entrySet()
        .stream()
        .anyMatch(e -> !mMap.containsKey(e.getKey()) || mMap.get(e.getKey()) < e.getValue());
if (found)
    return -1;

【讨论】:

  • 我想检查nMap中的所有条目是否都符合条件。
  • @AbhinavTyagi 在那种情况下,你为什么在你的条件第一次为真时返回 -1 ?无论如何,如果您想检查所有条目,请将 anyMatch 更改为 allMatch
  • 如果你只在 lambda 正文中使用e.getKey(),你可以只使用nMap.keySet().stream()。 (你是否错过了&lt; v?)
  • @AndyTurner 是的,我一定是在格式化答案时不小心删除了它。谢谢
  • 或者:boolean found = !mMap.keySet().containsAll(nMap.keySet()) || nMap.entrySet().stream() .anyMatch(e -&gt; mMap.get(e.getKey()) &lt; e.getValue());
猜你喜欢
  • 2018-07-11
  • 2014-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多