Eye*_*Spy 2 java collections lambda java-8 java-stream
我想尝试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);
Run Code Online (Sandbox Code Playgroud)
但是,这会抛出java.lang.IllegalStateException:stream已经被操作或关闭
通过这些信息,我当然可以通过打开两个流并过滤两次来实现它
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();
Run Code Online (Sandbox Code Playgroud)
但我现在的问题是关于表现.如果我必须过滤并映射两次流,那不是很慢.为什么我不能在流上多次操作,我不明白为什么他们这样实现它.在操作之后是否可以保持流打开,因为每个操作符方法都返回一个新流或单个值.
这是什么原因,或者我只是错误使用它?
如果你用一个好的旧方法,通过使用循环,你将使用一个循环计算max元素和平均值.所以你只需要在这里做同样的事情.幸运的是,Stream API可以为您完成:
IntStream s = arr.stream().mapToInt(i -> Integer::intValue).filter(i < 10);
IntSummaryStatistics stats = s.summaryStatistics();
double average = stats.getAverage();
int max = stats.getMax();
Run Code Online (Sandbox Code Playgroud)
阅读IntSummaryStatistics的javadoc可以帮助您了解如何自己实现这样的操作.
| 归档时间: |
|
| 查看次数: |
1534 次 |
| 最近记录: |