Лямбда-выражение не работает, прекращается - PullRequest
0 голосов
/ 02 января 2019

написал программу java8 с лямбда-выражением, она не исполняется, а завершается с лямбда-выражением, исключений нет

    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 голосов
/ 02 января 2019

В настоящее время вы только что определили функциональный интерфейс, для его дальнейшего выполнения вам необходимо вызвать реализацию в вашем коде. В вашем случае для этого вам нужно вызвать метод 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);
0 голосов
/ 02 января 2019

Это потому, что вы не вызываете метод BiConsumer accept.вызовите его следующим образом:

  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);
...