java - java - 筛选可选值的最小值

  显示原文与译文双语对照的内容

要获取对象列表的函数结果的最小值,但是这个函数的返回值是可选的。如果到目前为止没有设置fragment时间,返回值应该是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)对我很奇怪,我认为它必须有一个更好的解决方案。

时间:

你可以使用flat mapping和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)

第一个应该使用流作为基本类型,因为对min()有一个很好的支持。


public OptionalDouble getFragmentTime(int fragment) {


 ...


}



public OptionalDouble getMinFragmentTime(int fragment) {


 return entries.stream()


 .flatMap(e -> e.getFragmentTime(fragment).stream())


 .min();


}



OptionalDouble可以提供1或0双精度的流,AflatMap到DoubleStream,然后获取min。

代码未验证。

...