我正在尝试了解流并遇到问题: 我想获取列表的最小值并将其分配给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
。
问题是IDE在检查Optional.get
之前会发出.isPresent
被警告的警告。
为了解决这个问题,我使用了稍微不同的ifPresent
方法并尝试了以下方法:
int smallest = list.stream().min(Integer::compareTo).ifPresent(integer -> integer);
不幸的是,自从我收到警告后,这项工作无效:Bad return type in Lambda, Integer cannot be converted to void.
我的问题最终是:如何将最小值分配给int smallest
变量并检查ifPresent?
答案 0 :(得分:8)
以下是我的表现:
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);
}
}
答案 1 :(得分:6)
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;
答案 2 :(得分:2)
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;