我想获取对象列表的函数结果的最小值。
但是这个函数的返回值是 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/

10-15 10:41