【发布时间】:2020-02-11 15:25:16
【问题描述】:
我必须从自定义对象的List 中提取两个值( min 和 max ),目前我正在创建两次流并分别提取它。我认为使用单个流并使用 map 或类似函数在单个流中获取最小值和最大值可能是一种优化。这可行吗?
public class MyClass {
public static class MyC {
double val;
public MyC(double val) {
this.val = val;
}
public double getVal() {return val;}
}
public static void main(String[] args) {
List<MyC> list = new ArrayList<>();
list.add(new MyC(10.0d));
list.add(new MyC(20.0d));
double min = Optional.ofNullable(list).stream()
.flatMap(List::stream)
.limit(13)
.map(MyC::getVal)
.min(Double::compare)
.orElse(getMinDefault());
double max = Optional.ofNullable(list).stream()
.flatMap(List::stream)
.limit(13)
.map(MyC::getVal)
.max(Double::compare)
.orElse(getMaxDefault());
}
private static double getMinDefault() {
return 1.0d;
}
private static double getMaxDefault() {
return 20.0d;
}
}
【问题讨论】:
-
如果我知道怎么做,我就不会在这里发帖了 :)
-
您应该对列表进行排序并获取第一个和最后一个值,而不是运行两次流。
-
@SujayMohan 我不想对列表进行排序,因为列表会发生我不想要的变化,而且列表可能非常大。
标签: java performance java-stream