java8中的Stream相信大家都使用过,代码可以变得简洁漂亮,甚至习惯后,简直爱不释手,根本不想再使用以前的通俗写法。但是初学者很容易犯一些错误。
本文介绍一下Stream中可能会使用的一个错误用法:Stream.max(Integer::max)
和 Stream.min(Integer::min)
让我们先来看下如下代码:abcd分别输出什么?
int a = Stream.of(2, 1, 4, 5, 3).max(Integer::max).get(); System.out.println(a); // 2 int b = Stream.of(-2, -1, -4, -5, -3).max(Integer::max).get(); System.out.println(b); // -3 int c = Stream.of(2, 1, 4, 5, 3).min(Integer::min).get(); System.out.println(c); // 3 int d = Stream.of(-2, -1, -4, -5, -3).min(Integer::min).get(); System.out.println(d); // -2
答案:2,-3,3,-2
结果是不是和你预期的不太一样。没错,这种求流中数据大小的方式是错误的。
原因
原因其实很简单:(我们以a为例,将max()中拆分成Lambda展示)
int a = Stream.of(2,1,4,5,3).max((v,k) -> { int result = Integer.max(v, k); return result; }).get(); System.out.println(a);
看出来了吧,其实 result 返回的一直是两个值的最大值,而数据中全部都为正数,所以返回值总是正数。
Stream.max()
中,是以返回值的正、负和零值来判断数据大小的。那么 Stream.max()
中取到的总是正数,这样第一个数据比较下来,总是最大的。
同理:
Stream.of(-2,-1,-4,-5,-3).max(Integer::max).get();
数据都是负数,那么返回值也都是负数,所以最终获取的数据就是最后一个数据。
Stream.min(Integer::min)
也是一样的道理。
正确的写法:
int a = Stream.of(2,1,4,5,3).max(Integer::compare).get();------5 int b = Stream.of(2,1,4,5,3).min(Integer::compare).get();------1
用 Integer::compare
即可。
也可以直接:
int a = Stream.of(1,2,4,5,3).mapToInt(i -> i).max().getAsInt();
其实理解Stream.max()原理的朋友不会犯这样的错误,初学者没太在意的话可能会犯这样的错误。大家get到了么~
未经允许请勿转载:程序喵 » Stream的错误使用:Stream.max(Integer::max)和Stream.min(Integer::min)