gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:43:29 25 4
gpt4 key购买 nike

我必须用流完成这个微不足道的操作:给定一个列表,获取前 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com