【问题标题】:Java 8 Stream API :How to handle null value in MapJava 8 Stream API:如何处理地图中的空值
【发布时间】:2019-12-24 04:02:09
【问题描述】:

我有一个 Map 类型的数组列表。我想从列表中过滤掉空值并找到最大值和最小值。该程序运行良好,但 null 值除外。

ArrayList<Map<String, Float>> elements = new ArrayList<Map<String, Float>>();
Map<String, Float> element = new HashMap<String, Float>();
element.put("a", (float) 1.22);
element.put("b", (float) 1.33);
element.put("c", (float) 1.52);
element.put("d", (float) 1.452);
element.put("e", (float) 1.452);

Map<String, Float> element2 = new HashMap<String, Float>();
element2.put("a", (float) 1.2332);
element2.put("b", (float) 1.242);
element2.put("c", (float) 1.552);
element2.put("d", (float) 15.33);
element2.put("e",null);

elements.add(element);
elements.add(element1);
elements.add(element2);

System.out.println("Initial Mappings are: " + elements);
Map<String, Float> min = elements.stream() 
            .flatMap(m -> m.entrySet().stream())
            .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, Math::min));

System.out.println(min);

【问题讨论】:

  • 空地图或地图中的空元素?您的示例不包含任何空值
  • 您必须尝试确保您的Map 在现实中不允许null 写入如element2.put("e",null);。这在 JDK 本身中已通过 Java-9 中的 Map.ofimplementation 得到纠正。

标签: java dictionary filter java-stream


【解决方案1】:

向链中添加过滤器。

Map<String, Float> min = elements.stream()
            .flatMap(m -> m.entrySet().stream())
            .filter(entry -> entry.getValue() != null)
            .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, Math::min));

【讨论】:

    【解决方案2】:

    您可以使用filter 过滤空值并使用Collectors.summarizingDouble 获取min,maxaverage

    Map<String, DoubleSummaryStatistics> res = elements.stream() 
            .flatMap(m -> m.entrySet().stream())
            .filter(entry->Objects.nonNull(entry.getValue()) // check for null value
            .collect(Collectors.groupingBy(Map.Entry::getKey, Collectors.summarizingDouble(entry->entry.getValue())));
    
    res.forEach((k,v)->System.out.println("Key : "+k+", Min : "+v.getMin()+", Max : "+v.getMax()));
    

    【讨论】:

    • 这个问题并没有真正关注使用**SummaryStatistics,而是一个很好的建议,虽然实际答案是already exists
    猜你喜欢
    • 1970-01-01
    • 2017-09-09
    • 1970-01-01
    • 2016-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-29
    相关资源
    最近更新 更多