函数式编程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。 问题是为什么它不是按值排序,而是按键排序,并为我提供意外的输出
# 1 楼答案
Stream::min
期望某种东西符合Comparator
合同。但是Integer::min
不这样做,它只返回两个输入中的最小值。你应该改用Integer::compare
# 2 楼答案
您可以使用
mapToInt()
函数将Stream<Integer>
转换为IntStream
,然后对其调用min()
: