【问题标题】:Squaring even numbers using lambda expressions使用 lambda 表达式对偶数求平方
【发布时间】:2014-06-24 14:26:33
【问题描述】:

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

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

尝试了其他几件事,但这是我目前所处的位置

【问题讨论】:

  • 你的逻辑看起来不错。现在您需要在另一个集合中检索结果。
  • 试图让它影响同一个集合
  • @LuiggiMendoza 只是好奇,p -&gt; p = (long)Math.pow(p, 2) 是否没有效果,因为变量引用将按值传递,所以重新分配不会有效果?我对流没有太多经验,所以我很可能在这方面是错误的。我想象 lambda 大致相当于void method(Long p) { p = (long)Math.pow(p, 2);}。对吗?
  • @user3580294 我只是说逻辑看起来不错。我从来没有说过任何关于方法的事情。无论如何,请在此处查看:stackoverflow.com/q/14830313/1065197(在测试之前无法提供答案)。
  • @LuiggiMendoza 抱歉,您可能知道。

标签: java lambda java-8


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    另一种解决方案是将结果映射并使用Collectors#toList 将它们收集到List

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

    【讨论】:

    • 你可以去掉"p=".
    【解决方案3】:

    通常 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);
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-06-10
      • 2018-01-29
      • 1970-01-01
      • 2023-03-04
      • 2014-10-11
      • 1970-01-01
      相关资源
      最近更新 更多