【问题标题】:Java 8 stream min is not returning expected value [duplicate]Java 8 stream min 未返回预期值[重复]
【发布时间】:2017-09-08 17:39:11
【问题描述】:

我希望从 java 中的地图列表中获取最小值。我正在使用 flatmap、stream 和 min 的组合来这样做,但没有得到预期的结果。这是代码 公共类 TestMin {

public  static class TestHolder{
    public  static Map<String,Integer> getValues(){
        Map<String,Integer> map = new HashMap<>();
        map.put("a",1);
        map.put("b",3);
        map.put("c",2);

        return map;

    }
}

public static void main(String[] args) {
    List<Map<String, Integer>> l = new ArrayList<>();
    l.add(TestHolder.getValues());
    l.add(TestHolder.getValues());
    l.add(TestHolder.getValues());

    // Getting min
    int min = l.stream().map((m)->m.values()).flatMap((v)->v.stream()).min(Integer::min).get();
    System.out.println(min);
    }

}

输出为:2

当然,我期望的输出是 1。尝试一些调试表明它提供的输出值对应于“c”。即如果地图看起来像

[a->2 , b->3, c->1] 

那么我得到的输出是 1。 问题是为什么它不按值排序,而是按键排序并为我提供意外的输出。

【问题讨论】:

    标签: java functional-programming java-8 min flatmap


    【解决方案1】:

    Stream::min 期望符合Comparator 合同的内容。但是Integer::min 没有这样做,它只返回它的两个输入中的最小值。你应该改用Integer::compare

    【讨论】:

    • 感谢 Oliver@ 的回复。正如所料,你是对的。一个后续问题,我们如何在编译时捕获此类错误/错误?
    • @maneet 你不能,但你可以写测试。
    • @maneet - 这是一个逻辑错误;目前尚不清楚如何在编译时捕捉到它(假设Comparator::compareTo 返回一个int)。
    • Flown@ 你是对的。其实,我就是这样抓到的。感谢 Oliver@ 的回复 :-)
    【解决方案2】:

    您可以使用mapToInt() 函数将Stream&lt;Integer&gt; 转换为IntStream,然后在其上调用min()

    int min = l.stream()
            .map(Map::values)
            .flatMap(Collection::stream)
            .mapToInt(Integer::intValue)
            .min().orElse(defaultMinValue);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-08-27
      • 2018-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-04
      相关资源
      最近更新 更多