有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java过滤可选值的最小值

我想得到一个对象列表的函数结果的最小值。 但是这个函数的返回值是可选的。 因此,如果到目前为止还没有设置片段时间,那么返回值应该是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)对我来说似乎很奇怪,我认为一定有更好的解决方案


共 (1) 个答案

  1. # 1 楼答案

    开始,您可以利用平面映射的优势来使用Optional::stream

    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)

    的情况下,你必须坚持.filter(Optional::isPresent).map(Optional::get)