我正在尝试获取一个数字列表,过滤掉偶数,然后对这些偶数进行平方,以便原始列表中的偶数进行平方。这是我的代码:
ArrayList<Long> nums2 = new ArrayList<Long>();
for(long i = 0; i < 100000; i++)
nums2.add(i);
nums2.stream().filter(p -> p%2 == 0).forEach(p -> p = (long)Math.pow(p, 2));
尝试了其他一些事情,但这是我到目前为止的地方
答案 0 :(得分:6)
您需要对结果执行某些操作,例如将其存储在数组中。另请注意,您不需要初始列表,可以直接从流开始:
long[] result = IntStream.range(0, 100000) //instead of your initial list
.filter(p -> p % 2 == 0) //filters
.mapToLong(p -> (long) Math.pow(p, 2)) //"replaces" each number with its square
.toArray(); //collect the results in an array
或者您可以决定打印结果:
IntStream.range(0, 100000)
.filter(p -> p % 2 == 0)
.mapToLong(p -> (long) Math.pow(p, 2))
.forEach(System.out::println);
答案 1 :(得分:3)
另一种解决方案是将结果映射并使用List
将其收集到Collectors#toList
:
List<Long> results = nums2.stream()
.filter(p -> p%2 == 0)
.map(p -> p = (long)Math.pow(p, 2))
.collect(Collectors.toList());
答案 2 :(得分:0)
通常,java 8 lambdas用作没有副作用的函数 (不改变原始列表),因此我建议你 当您想要进行就地更改时,请使用经典的for循环:
ArrayList<Long> nums2 = new ArrayList<Long>();
for(long i = 0; i < 100000; ++i){
nums2.add(i);
}
long even=0;
for(int n=0;n<nums2.size();++n){
if((even=nums2.get(n))%2==0)
nums2.set(n, even*even);
}