use*_*344 3 java optional java-8 java-stream
我想获取对象列表的函数结果的最小值。但是这个函数的返回值是可选的。所以如果到目前为止没有设置片段时间就可以了,然后返回值应该是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);
}
Run Code Online (Sandbox Code Playgroud)
这是存档的正确方法吗?这两个函数调用.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>
Run Code Online (Sandbox Code Playgroud)
请注意,这.min(Double.compare);是不正确的用法,参数实际上是 lambda 表达式((d1, d2) -> Double.compare(d1, d2),应缩短为方法引用Double::compare。也可以使用Comparator.comparingDouble(d -> d)。
在java-8 的情况下,你必须坚持使用.filter(Optional::isPresent).map(Optional::get).
| 归档时间: |
|
| 查看次数: |
820 次 |
| 最近记录: |