Java 8:Lambda表达式包含多个语句/逻辑

5

我写了一个简单的程序,使用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);

    }

}

在下面的程序中,我有超过2个逻辑需要在lambda内执行。我面临的问题是如何更新第4种方式,即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 : ");});

    }

}
2个回答

5
似乎您想知道如何将“t +“两次是:”+ t * 2 +“,”传递给方法引用。您无法向方法引用传递显式参数,并且无法将方法引用与Lambda表达式组合使用。
您可以使用“Stream”管道首先对“t”进行映射,无论您希望为每个“t”的值打印什么内容,然后使用方法引用的“forEach”打印它:
list.stream().map(t -> t + "  Twice is : " + t*2 + "  , ").forEach(System.out::print);

4

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

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 + "  , ");
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接