【发布时间】:2014-08-13 20:38:37
【问题描述】:
我想尝试 lambdas 的一些功能,并想编写一个 ArrayList 过滤器并使用 IntStream 的方法来计算一个数字 ArrayList 的平均值和最大值
我的第一个想法是过滤 ArrayList,保存流,然后使用方法计算:
ArrayList<Integer> arr = new ArrayList<>();
arr.add(5);
arr.add(7);
arr.add(11);
IntStream s = arr.stream().filter(i -> i < 10).mapToInt(i -> (int)i);
int maxBelowTen = s.max().getAsInt();
double avgBelowTen = s.average().getAsDouble();
System.out.println("Maximum below ten: " + maxBelowTen);
System.out.println("Average below ten: " + avgBelowTen);
但是,这会引发 java.lang.IllegalStateException:流已被操作或关闭
有了这些信息,我当然可以通过打开两个流并过滤两次来实现它
int maxBelowTen = arr.stream().filter(i -> i < 10).mapToInt(i -> (int) i).max().getAsInt();
double avgBelowTen = arr.stream().filter(i -> i < 10).mapToInt(i -> (int) i).average().getAsDouble();
但我现在的问题是关于性能。如果我必须两次过滤和映射流,那不是很慢。为什么我不能对流进行多次操作,我不明白他们为什么以这种方式实现它。 是否有可能在操作后让流保持打开状态,因为每个运算符方法都返回一个新流或单个值。
这是什么原因,还是我用错了?
【问题讨论】:
标签: java collections lambda java-8 java-stream