Java 使用lambda表达式对偶数求平方

Java 使用lambda表达式对偶数求平方,java,lambda,java-8,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)); A

我试图得到一个数字列表,过滤掉偶数,然后将这些偶数平方,这样原始列表中的偶数就是平方。这是我的密码:

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));
ArrayList nums2=new ArrayList();
对于(长i=0;i<100000;i++)
nums2.添加(i);
nums2.stream().filter(p->p%2==0).forEach(p->p=(long)Math.pow(p,2));

尝试了一些其他的方法,但这就是我目前所处的位置

您需要对结果执行一些操作,例如将其存储在数组中。还请注意,您不需要初始列表,可以直接从流开始:

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

另一种解决方案是映射结果并使用
收集器#toList
将其收集到
列表中:

List<Long> results = nums2.stream()
    .filter(p -> p%2 == 0)
    .map(p -> p = (long)Math.pow(p, 2))
    .collect(Collectors.toList());
List results=nums2.stream()
.filter(p->p%2==0)
.map(p->p=(long)Math.pow(p,2))
.collect(Collectors.toList());

通常使用java 8 lambda作为函数,没有副作用 (不改变原来的清单),因此我建议你 当您希望进行就地更改时,请使用经典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);
    }
ArrayList nums2=new ArrayList();
对于(长i=0;i<100000;++i){
nums2.添加(i);
}
长偶数=0;

对于(int n=0;n)您的逻辑似乎很好。现在您需要在另一个集合中检索结果。尝试使其效果相同collection@LuiggiMendoza只是好奇,会
p->p=(long)Math.pow(p,2)
没有效果,因为变量引用将通过值传递,所以重新分配不会产生效果?我对流没有太多经验,所以我很可能在这方面是错误的。我想象lambda大致相当于
void method(Long p){p=(Long)Math.pow(p,2);}
。是这样吗?@user3580294我只是说逻辑似乎很好。我从来没有说过任何关于方法的事情。无论如何,在这里回顾:(在测试之前无法提供答案)。@luigimendoza抱歉,我想你可能知道。你可以删除“p=”。