我想获取对象列表的函数结果的最小值。
但是这个函数的返回值是 optional 。
所以如果到目前为止没有设置片段时间并且返回值应该是 Optional.empty()
就可以了
public Optional<Double> getFragmentTime(int fragment) {
...
}
private List<Entry> entries; // will be filled in the ctor.
public Optional<Double> getMinFragmentTime(int fragment) {
return entries.stream()
.map(e -> e.getFragmentTime(fragment))
.filter(Optional::isPresent)
.map(Optional::get)
.min(Double::compare);
}
这是存档的正确方法吗?
这两个函数调用
.filter(Optional.isPresent)
和 .map(Optional.get)
对我来说似乎很奇怪,我认为必须有更好的解决方案。 最佳答案
您可以使用平面映射的优势和 Optional::stream
,因为 java-9 可用:
return entries.stream() // Stream<Entry>
.map(e -> e.getFragmentTime(fragment)) // Stream<Optional<Double>>
.flatMap(Optional::stream) // Stream<Double>
.min(Double::compare); // Optional<Double>
请注意
.min(Double.compare);
的用法不正确,该参数实际上是 lambda 表达式 ((d1, d2) -> Double.compare(d1, d2)
,应缩短为方法引用 Double::compare
。也可以使用 Comparator.comparingDouble(d -> d)
。在 java-8 的情况下,您必须坚持使用
.filter(Optional::isPresent).map(Optional::get)
。关于java - 过滤 optional 值的最小值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59951032/