【问题标题】:Java 8 stream conditional checkJava 8 流条件检查
【发布时间】:2019-05-08 03:48:38
【问题描述】:
List<Map<String,Object>> list= new List<Map<String,Object>>();
System.out.println(list.stream().mapToInt(i ->  (Integer)i.get("amount")).sum());

我有一个类似上面的项目列表。我正在尝试打印金额的总和,这将是地图内的关键。这工作正常。但我只是想知道是否有办法检查地图是否在这一行代码中包含该键。有什么方法可以在这里包含 map.containsKey 的 if 条件吗?

【问题讨论】:

  • 如果没有,你会期待什么?它应该默认为0吗?
  • 是的,或者我不需要拿那张地图来求和

标签: java java-8 hashmap


【解决方案1】:

您可能正在寻找getOrDefault 用作:

list.stream().mapToInt(i ->  (Integer)i.getOrDefault("amount", 0)).sum());

key 不存在时返回0 作为默认值。

【讨论】:

  • 这将满足我的要求。但仍然想知道我们是否可以在此处添加条件逻辑?
  • @JavaProgrammer 当然,您可以在map 步骤之前插入.filter(i -&gt; i.containsKey("amount"))。但这太微不足道了,我不确定这是否是您的实际问题。
  • @Holger ,虽然 Naman 的回答在某种程度上解决了我面临的问题,但你的回答正是我被问到的 :)
【解决方案2】:

您可以使用Stream.filter 仅获取具有键amount 的地图进行求和。

System.out.println(list.stream().filter(m -> m.containsKey("amount")).mapToInt(i ->  (Integer)i.get("amount")).sum());

【讨论】:

  • 但这不起作用。如果我在列表中的一个地图项中将键从“数量”更改为“数量”,同时将所有其他项保持为“数量”。它打破了
【解决方案3】:

您可以将Stream::filterObjects::nonNull 结合使用

list.stream()
    .map(map -> map.get("amount"))
    .filter(Objects::nonNull)
    .mapToInt(Integer.class::cast)
    .sum()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多