java - 在 Java 中两次使用相同的列表和流

标签 java java-8 java-stream

我必须用流完成这个微不足道的操作:给定一个列表,获取前 20 个元素的总和。

这是我的想法

IntStream stream = obj.stream().mapToInt(d->d.getInt());
stream.limit(20).sum() / stream.sum();

但是我不能这样做,因为我被告知我不能重用流,所以..我尝试了以下方法:

List<Integer> counts = obj.stream()
    .mapToInt(d -> d.getInt())
    .boxed().collect(Collectors.toList());

counts.stream().limit(20).sum() / counts.stream().sum();

但是我被告知我不能在 Stream 上使用 sum,所以我需要再次为这个简单操作的左侧和右侧使用 mapToInt。

有没有办法使用流以更优雅和简洁的方式执行此操作?

最佳答案

有一种很酷的方法可以在单次并行传递中执行此操作,但不使用流。

int[] nums = obj.stream().mapToInt(Integer::intValue).toArray();
Arrays.parallelPrefix(nums, Integer::sum);
int sumOfFirst20 = nums[19];
int sumOfAll = nums[nums.length-1];

parallelPrefix 方法将就地计算数组上指定函数(此处为加号)的部分和序列。所以第一个元素是a0;第二个是a0+a1,第三个是a0+a1+a2,以此类推

关于java - 在 Java 中两次使用相同的列表和流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29009336/

相关文章:

java - 在流中处理空指针和抛出异常

java - 为一个属性java设置多个值以添加到过滤列表中

Java 8 流 - 使用带有替代累加器返回类型的 reduce

java - 使用 Java Stream API 获取大写字符作为字符串

java - Class<T> 不接受 ParameterizedTypeReference

自动关闭资源的Java 8 Stream(基于资源).iterator()?

java - 违反 EJB 规范

java - 多次调用时用于 Iterable 实现的模拟拆分器?

java - 关于效率的一般查询

java - 从jsp调用bean方法