使用lambda表达式平均偶数

时间:2014-05-07 14:32:15

标签: java lambda java-8

我正在尝试获取一个数字列表,过滤掉偶数,然后对这些偶数进行平方,以便原始列表中的偶数进行平方。这是我的代码:

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));

尝试了其他一些事情,但这是我到目前为止的地方

3 个答案:

答案 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);
    }