Java 8 stream min未返回预期值

时间:2017-04-12 19:25:52

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

我希望从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.尝试一些调试表明它提供的输出值对应于&#34; c&#34;。即如果地图看起来像

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

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

2 个答案:

答案 0 :(得分:6)

Stream::min期望符合Comparator合同的内容。但是Integer::min没有做到这一点,它只返回其两个输入的最小值。您应该使用Integer::compare代替。

答案 1 :(得分:0)

您可以使用mapToInt()函数将Stream<Integer>转换为IntStream,然后只需在其上调用min()

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