有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

函数式编程Java 8 stream min未返回预期值

我希望从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”对应的输出值。i、 如果地图看起来像

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

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


共 (2) 个答案

  1. # 1 楼答案

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

  2. # 2 楼答案

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

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