有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Lambda表达式不工作,正在终止

用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) 个答案

  1. # 1 楼答案

    这是因为您没有调用BiConsumeraccept方法。可以这样称呼:

      bc.accept(list1, list2);
    

    此外,请注意,没有必要只调用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);
    
  2. # 2 楼答案

    您目前刚刚定义了函数接口,要进一步执行它,需要在代码中调用实现。在您的情况下,为此,需要调用^{}方法,如下所示:

    bc.accept(list1, list2);
    

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

    Performs this operation on the given arguments.


    另一方面,如果我建议的话,你可能只是想打印(至少)你正在消费的两个列表:

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

    它将打印为输出

    (根据评论)这可以进一步写成:

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