【问题标题】:Lambda Expression is not working, getting terminatedLambda 表达式不工作,被终止
【发布时间】:2019-01-02 11:49:44
【问题描述】:

用 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();
        }

    }

}

预计它会打印列表中的字符串

【问题讨论】:

    标签: java lambda java-8 functional-interface


    【解决方案1】:

    这是因为您没有调用BiConsumeraccept 方法。如下调用:

      bc.accept(list1, list2);
    

    另外,请注意,不必调用stream 只是调用forEach 而是直接在列表中调用forEach

     lista.forEach(System.out::print);
    

    还有一点是你的BiConsumer没有使用第二个列表,这可能是因为你还没有完成整个逻辑的实现,在这种情况下是可以理解的。

    完整代码:

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

    【讨论】:

    • 感谢您的回复,能否请您给我完整的语法,我的意思是整个代码行
    • for bc.accept(list1, list2);我应该在哪里调用我没有得到的 lambda 表达式
    • 非常感谢
    【解决方案2】:

    您当前刚刚定义了功能接口,要进一步执行它,您需要在代码中调用实现。在您的情况下,为此,您需要将 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

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

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

    【讨论】:

    • bc = (lista, listb) -&gt; Stream.concat(lista.stream(),listb.stream()).forEach( System.out::print);
    • @HadiJ 好吧,同意。只是恕我直言,这个问题与计算部分无关。无论如何感谢您的建议。
    猜你喜欢
    • 1970-01-01
    • 2022-11-18
    • 2010-12-10
    • 1970-01-01
    • 1970-01-01
    • 2018-12-21
    • 2013-03-02
    • 1970-01-01
    • 2014-06-21
    相关资源
    最近更新 更多