加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – 如何仅使用reduce查找List中的最小值?

发布时间:2020-12-15 04:47:55 所属栏目:Java 来源:网络整理
导读:我想只使用reduce来查找List Integer中的最小值.这是我最初的想法: ListInteger lst;//init//assuming it's not emptylst.stream().reduce(lst.get(0),(x,y) - x.compareTo(y) = 0 ? x : y); 但在the contract的方法中说: The identity value must be an i
我想只使用reduce来查找List< Integer>中的最小值.这是我最初的想法:

List<Integer> lst;
//init
//assuming it's not empty
lst.stream().reduce(lst.get(0),(x,y) -> x.compareTo(y) <= 0  ? x : y);

但在the contract的方法中说:

The identity value must be an identity for the accumulator function.
This means that for all t,accumulator.apply(identity,t) is equal to
t. The accumulator function must be an associative function.

因此,唯一可能的身份值保留累加器(x,y)的合同 – > x.compareTo(y)< = 0? x:y是最大值.因此我们有一些鸡蛋问题. 如何解决它保留所有合同?

解决方法

使用Integer.MAX_VALUE.其他一切都将小于或等于,所以它满足所有t的min(identity,t)== t的契约.

进一步研究后,我认为你不需要这个身份.有一个简化只是将函数作为参数,http://docs.oracle.com/javase/8/docs/api/java/util/stream/Stream.html#reduce-java.util.function.BinaryOperator-.这将返回Optional< Integer>而不是整数.我相信,原因是该方法必须处理流中没有元素的情况.在这种情况下,Optional< Integer> version会返回一个空值;虽然需要一个标识并返回一个Integer的版本会返回标识值(类似于数学中如果添加一组数字并且它是空的,你应该得到0,如果你乘以一组数字并且它是空的,你应该得到1).所以,如果你知道你的列表是非空的,你实际上应该能够写

lst.stream().reduce((x,y) -> x.compareTo(y) <= 0  ? x : y).get();

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读