Lambda 表达式不工作,被终止
Lambda Expression is not working, getting terminated
用 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();
}
}
}
预计它会打印列表中的字符串
这是因为您没有调用 BiConsumer
的 accept
方法。称呼它如下:
bc.accept(list1, list2);
此外,请注意,不必为了调用 forEach
而调用 stream
,而是直接在列表中调用 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);
您目前刚刚定义了功能接口,要进一步执行它,您需要在代码中调用实现。在您的情况下,为此,您需要将 BiConsumer.accept
方法调用为:
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);
这将打印为输出 A B V J G P
.
(来自评论)这可以进一步写成:
BiConsumer<List<String>, List<String>> biConsumer =
(lista, listb) -> Stream.concat(lista.stream(), listb.stream())
.forEach( System.out::print);
用 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();
}
}
}
预计它会打印列表中的字符串
这是因为您没有调用 BiConsumer
的 accept
方法。称呼它如下:
bc.accept(list1, list2);
此外,请注意,不必为了调用 forEach
而调用 stream
,而是直接在列表中调用 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);
您目前刚刚定义了功能接口,要进一步执行它,您需要在代码中调用实现。在您的情况下,为此,您需要将 BiConsumer.accept
方法调用为:
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);
这将打印为输出 A B V J G P
.
(来自评论)这可以进一步写成:
BiConsumer<List<String>, List<String>> biConsumer =
(lista, listb) -> Stream.concat(lista.stream(), listb.stream())
.forEach( System.out::print);