Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/371.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何仅使用reduce在列表中查找最小值?_Java_Java 8_Java Stream - Fatal编程技术网

Java 如何仅使用reduce在列表中查找最小值?

Java 如何仅使用reduce在列表中查找最小值?,java,java-8,java-stream,Java,Java 8,Java Stream,我只想使用reduce在列表中查找最小值。这是我第一次想到的: List<Integer> lst; //init //assuming it's not empty lst.stream().reduce(lst.get(0), (x, y) -> x.compareTo(y) <= 0 ? x : y); 列表lst; //初始化 //假设它不是空的 lst.stream().reduce(lst.get(0)、(x,y)->x.compareTo(y)x.com

我只想使用
reduce
列表中查找最小值。这是我第一次想到的:

List<Integer> lst;
//init
//assuming it's not empty
lst.stream().reduce(lst.get(0), (x, y) -> x.compareTo(y) <= 0  ? x : y);
列表lst;
//初始化
//假设它不是空的

lst.stream().reduce(lst.get(0)、(x,y)->x.compareTo(y)x.compareTo(y)使用
Integer.MAX_值
。其他所有值都将小于或等于该值,因此它满足所有
t
的契约

进一步研究后,我认为您不需要标识。有一个
reduce
函数作为参数。它将返回
Optional
,而不是
Integer
。我认为,原因是该方法必须处理流中没有元素的情况。在这种情况下,t
可选
版本将返回空值;而需要
标识
并返回
整数
的版本将返回标识值(类似于在数学中,如果添加一组空数字,则应得到0,如果将一组空数字相乘,则应得到1)因此,如果你知道你的列表是非空的,你实际上应该能够写

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

lst.stream().reduce((x,y)->x.compareTo(y)仅使用reduce解决问题:

List<Integer> lst;
//init
//assuming it's not empty
int min = lst.get(0);
min = lst.stream().reduce(min, (x, y) -> x.compareTo(y) <= 0  ? x : y);
System.out.println(min);
列表lst;
//初始化
//假设它不是空的
int min=lst.get(0);

min=lst.stream().reduce(min,(x,y)->x.compareTo(y)您可以通过在
stream上使用单参数
reduce(…)
方法来避免/推迟问题,如下所示:

lst.stream().reduce((x, y) -> x.compareTo(y) <= 0  ? x : y);
还返回一个
可选的
,但涉及装箱/拆箱以进行比较

您可以在运行
Math.min(…)
之前取消装箱,这可能会稍微有效一些:

lst.stream().mapToInt(Integer::intValue).reduce(Math::min);

这将返回一个
OptionalInt
,它可以用与
Optional
类似的方式处理,而无需取消装箱。

您可以使用它来获取最小值

int min = lst.stream().reduce(Integer::min).get();
为了得到max

int min = lst.stream().reduce(Integer::max).get();

使用
Integer.MAX\u VALUE
。或返回
可选值的值。很好奇,lst.stream().mapToInt(Integer::intValue).min()有什么问题@TriCore Nothing,我只是想了解缩减。我很好奇是否有人能展示一个不遵守合同会导致bug的场景。如果在应用所有过滤器后流永远不会为空,那么MAX_值标识可以正常工作,但如果确实发生这种情况,2参数缩减将计算为MAX_值。Bett呃,使用1-param reduce来避免这种情况。嗯……但它不可靠,不是吗?为什么不可靠?当您使用第一个元素初始化min时,可以保证它不会低于列表中的最小值。老实说,我不知道:)。拒绝遵守合同可能会产生非常微妙的错误…谢谢。但是你不能解释一下为什么他们不提供类似
reduce(t anyobjectnotneedessaryidentity,binarymoperator)
?@user3663882 min函数的特殊之处在于,任何输入元素都可以作为reduce()的第一个参数。如果进行求和,则二进制运算符将是
+
,其标识当然为零。如果使用任何其他值作为第一个参数,则会得到错误的答案。@user3663882:您要求的东西存在。只需使用
reduce(BinaryOperator reductionFunction)。orElse(T anyObjectNotEssentialy identity)
但是,不是
.reduce((x,y)->x.compareTo(y)@Holger-true,而是OP说他们发布这个问题是因为他们想理解
reduce
int min = lst.stream().reduce(Integer::min).get();
int min = lst.stream().reduce(Integer::max).get();