我正在尝试学习streams,但遇到了一个问题:我想获取列表的最小值,并将其赋给一个int变量。为此,我做了以下工作:
List<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
int smallest = list.stream().min(Integer::compareTo).get();
System.out.println(smallest);这工作得很好,因此我得到了1。问题是,在检查.isPresent之前,集成开发环境会给出一个警告,说明调用了Optional.get。为了解决这个问题,我使用了稍微不同的ifPresent方法,并尝试了以下方法:
int smallest = list.stream().min(Integer::compareTo).ifPresent(integer -> integer);不幸的是,这不起作用,因为我得到了警告:Bad return type in Lambda, Integer cannot be converted to void.我的最后一个问题是:如何在检查ifPresent的情况下将最小值赋给int smallest变量?
发布于 2016-08-01 04:35:31
Stream#min返回结果的Optional,因为在一般情况下,流可以为空,因此不能有最小值。
Optional<Integer> minimal = list.stream().min(Integer::compareTo);要从Optional中获取值,您需要有一些回退值
Integer absent = Integer.MIN_VALUE;最简单的方法是使用orElse
Integer smallest = minimal.orElse(absent);更长一点的时间将是isPresent
Integer smallest = minimal.isPresent() ? minimal.get() : absent;发布于 2016-08-01 04:34:54
我是这样做的:
package lambdas;
import java.util.ArrayList;
import java.util.List;
/**
* Created by Michael
* Creation date 7/31/2016.
* @link https://stackoverflow.com/questions/38688119/java-8-streams-ifpresent
*/
public class MinimumExample {
public static void main(String[] args) {
List<Integer> list = new ArrayList<>();
int smallest = list.stream().min(Integer::compareTo).orElse(Integer.MIN_VALUE);
System.out.println(smallest);
}
}发布于 2016-08-01 04:37:47
ifPresent方法接受Consumer<? super T>作为参数。简单地说,它应该是一个没有return语句的操作。如果值存在,则可以打印该值,如下所示
[...].ifPresent(System.out::print);但这并不是IDEA所说的。我认为,您只需要保存一个Option<Integer>实例,然后通过isPresent检查它
Optional<Integer> o = list.stream().min(Integer::compareTo);
if (o.isPresent()) {
smallest = o.get();
}当然,使用orElse还有更方便的方法
smallest = o.orElse(Integer.MIN_VALUE);或者使用三元运算符:
smallest = o.isPresent() ? o.get() : Integer.MIN_VALUE;https://stackoverflow.com/questions/38688119
复制相似问题