【问题标题】:Java 8: Lambda expression contains more than one statement/logicJava 8:Lambda 表达式包含多个语句/逻辑
【发布时间】:2016-07-24 09:28:24
【问题描述】:

我编写了一个简单的程序来使用 java 8 lambda 遍历 List

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.function.Consumer;

public class FirstLamdaExpression {

    public static void main(String[] args) {
        List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
        //Way 1 : old way
        list.forEach(new Consumer<Integer>() {

            @Override
            public void accept(Integer t) {
                System.out.print(t + " ");

            }
        });

        //Way 2
        System.out.println(" ");
        list.forEach((Integer t) -> System.out.print(t + " "));

        //Way 3
        System.out.println(" ");
        list.forEach((t) -> System.out.print(t + " "));

        //Way 4
        System.out.println(" ");
        list.forEach(System.out::print);

    }

}

在下面的程序中,我有两个以上的逻辑要在 lambda 中执行。我面临的问题是如何更新第四种方式,即System.out::print?

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.function.Consumer;

public class SecondLamdaExpression {

    public static void main(String[] args) {
        List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
        //Way 1 : Old way
        list.forEach(new Consumer<Integer>() {

            @Override
            public void accept(Integer t) {
                System.out.print(t + "  Twice is : ");
                System.out.print(t*2 + "  , ");

            }
        });

        //Way 2
        System.out.println(" ");
        list.forEach((Integer t) -> 
             {System.out.print(t + "  Twice is : ");
                System.out.print(t*2 + "  , ");
             });

        //Way 3
        System.out.println(" ");
        list.forEach((t) ->  {System.out.print(t + "  Twice is : ");
        System.out.print(t*2 + "  , ");
         });

        //Way 4
        //System.out.println(" ");
        //list.forEach((t)-> System.out::print{(t + "  Twice is : ");});

    }

}

【问题讨论】:

    标签: java list lambda java-8


    【解决方案1】:

    您似乎在问如何将t + " Twice is : " + t*2 + " , " 传递给方法引用。不能将显式参数传递给方法引用,也不能将方法引用与 lambda 表达式结合。

    您可以使用Stream 管道首先将map t 打印为t 的每个值,然后使用带有方法参考的forEach 打印它:

    list.stream().map(t -> t + "  Twice is : " + t*2 + "  , ").forEach(System.out::print);
    

    【讨论】:

      【解决方案2】:

      代码中的第四种方式是方法引用。您不能将其应用于多个语句,甚至不能应用于接受多个参数的方法。我在这里唯一能想到的就是将此登录名提取到一个方法中:

      public class SecondLamdaExpression {
          public static void main(String[] args) {    
              List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
      
              // First three ways not repeated here
      
              // Way 4
              System.out.println(" ");
              list.forEach(SecondLamdaExpression::printTwice);
          }
      
          private static void printTwice(Integer t) {
              System.out.print(t + "  Twice is : ");
              System.out.print(t*2 + "  , ");
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-11-22
        • 1970-01-01
        • 1970-01-01
        • 2017-11-16
        • 1970-01-01
        • 2014-10-23
        • 1970-01-01
        相关资源
        最近更新 更多