Lambda Expression不起作用,被终止

时间:2019-01-02 11:49:45

标签: java lambda java-8 functional-interface

使用lambda表达式编写java8程序,它不会执行,而是在lambda表达式处终止,没有异常

    import java.util.ArrayList;
    import java.util.List;
    import java.util.function.BiConsumer;

    public class BiConsumerTest {


    public static void main(String[] args) {
        try{


        List<String> list1 = new ArrayList<String>();

        list1.add("A");
        list1.add("B");
        list1.add("V");


    List<String> list2 = new ArrayList<String>();

        list2.add("J");
        list2.add("G");
        list2.add("P");

        BiConsumer<List<String>  , List<String>> bc = (lista, listb) ->{
                lista.stream().forEach( System.out::print);

            };


        }catch(Exception ex){
            ex.printStackTrace();
        }

    }

}

预期会在列表中打印字符串

2 个答案:

答案 0 :(得分:3)

这是因为您没有调用BiConsumer的{​​{1}}方法。称之为:

accept

此外,请注意,不必仅在列表上调用 bc.accept(list1, list2); 而是直接stream来调用forEach

forEach

另一件事是您的 lista.forEach(System.out::print); 不使用第二个列表,这可能是因为您尚未完成整个逻辑的实现,在这种情况下,这是可以理解的。

完整代码:

BiConsumer

答案 1 :(得分:3)

您目前刚刚定义了功能接口,要进一步执行该功能接口,您需要在代码中调用实现。对于您的情况,为此,您需要按以下方式调用BiConsumer.accept方法:

bc.accept(list1, list2);

然后执行您定义的操作。如其Javadoc所述

  

对给定参数执行此操作。


另一方面,如果我要建议的话,您可能只是打算(至少)打印您正在使用的两个列表:

BiConsumer<List<String>, List<String>> biConsumer = (lista, listb) -> {
    lista.forEach(System.out::print);
    listb.forEach(System.out::print);
};
biConsumer.accept(list1, list2);

,它将打印为输出 A B V J G P

(来自评论)这可以进一步写成:

BiConsumer<List<String>, List<String>> biConsumer =
                      (lista, listb) -> Stream.concat(lista.stream(), listb.stream())
                                              .forEach( System.out::print);