Stream的错误使用:Stream.max(Integer::max)和Stream.min(Integer::min)

java8中的Stream相信大家都使用过,代码可以变得简洁漂亮,甚至习惯后,简直爱不释手,根本不想再使用以前的通俗写法。但是初学者很容易犯一些错误。

本文介绍一下Stream中可能会使用的一个错误用法:Stream.max(Integer::max)和Stream.min(Integer::min)

让我们先来看下如下代码:

int a = Stream.of(2,1,4,5,3).max(Integer::max).get();
System.out.println(a);

int b = Stream.of(-2,-1,-4,-5,-3).max(Integer::max).get();
System.out.println(b);

int c = Stream.of(2,1,4,5,3).min(Integer::min).get();
System.out.println(c);

int d = Stream.of(-2,-1,-4,-5,-3).min(Integer::min).get();
System.out.println(d);
abcd分别输出什么?-----------------------------------------------答案: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到了么~


  • 15
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值