java - 类型不匹配无法从 Integer 转换为 Optional
问题描述
我现在正试图理解流。我想将流中的最高数字保存为可选,但程序只允许我将其保存为整数。由于流可能是空的,所以没有最高值,我希望能够将其保存为可选。
到目前为止,我已经尝试过:
import java.util.ArrayList;
import java.util.Collection;
import java.util.Comparator;
import java.util.Optional;
import java.util.stream.Stream;
public class StreamsTest {
public static void main(String[] args) {
Collection<Integer> list = new ArrayList<Integer>();
for (int i = 0; i < 10; i++) {
list.add(i);
}
Stream<Integer> stream1 = list.stream().filter(x -> x % 2 == 1);
if (stream1.findAny().isPresent() == true)
System.out.println("Hey");
Optional<Integer> opt = stream1.max(Comparator.comparing(Integer::valueOf)).get();
}
}
是因为 .get() 吗?我可以想象,当我使用它时,程序期望得到一个值。如果它没有得到一个值,此时它已经崩溃了,没有必要尝试将它保存到一个变量中。所以它要么获取一个值并将其保存在一个整数变量中,要么它崩溃,因为 .get() 无法为 Optional 提供输入。
解决方案
get
返回值本身,它解开Optional
,所以变量类型必须是Integer
。
Integer opt = stream1.max(Comparator.comparing(Integer::valueOf)).get();
请注意,get
没有isPresent
是不安全的,可能会导致异常。
不过有更好的方法
int max = list.stream()
.filter(x -> x % 2 == 1)
.mapToInt(Integer::valueOf)
.max()
.orElse(0); // or other value
这个检查
if (stream1.findAny().isPresent() == true)
System.out.println("Hey");
是不正确的,因为它总是正确的 (1) [根据您的输入判断] 并在流上使用终端操作(2) [意味着您以后不能像您尝试那样重用它]。
整个方法可以重写为
IntStream
.range(0, 10)
.filter(x -> x % 2 == 1)
.max()
.orElseThrow(() -> new IllegalArgumentException("no max"));
请注意,我在这里使用了不同的技术。如果无法计算最大值(流中没有元素),我将抛出异常。
推荐阅读
- javascript - onMouseOver 函数在 mouseOver 之前触发
- php - 将值设置为表单上下文之外的表单变量
- github - 其他人 Github 回购显示在我的个人资料中
- python - 我的课不工作,它忽略了变量
- windows - Docker Build COPY Pipfile Pipfile.lock 缓存键错误
- python - 使用控制器的 Tkinter 交叉引用类和变量?
- python - 根据另一个数据框中具有最小值/最大值的列从熊猫数据框中选择值
- python - 弹性搜索连接
- reactjs - 使用 reactstrap 切换手风琴功能?
- azure - 尝试运行 Get-AzStorageBlob 时出错