Java 为什么forEach(System.out::println)工作,而map(System.out::println)失败?

Java 为什么forEach(System.out::println)工作,而map(System.out::println)失败?,java,java-8,java-stream,Java,Java 8,Java Stream,我正在做Streams教程练习(来自Oracle),不知道为什么会出现这个编译器错误(EclipseIDE) 无法推断map(函数)的类型参数map旨在将每个输入A映射到结果B System.out.println(String)返回void,即nothing。因此,它不适合作为map的参数 即使允许,map也不是一个终端操作。所有流都必须以终端操作结束,否则它们将什么也不做。因为map需要一个返回值的函数,而forEach不需要。使用map的正确方法是收集并打印输出。List collect=

我正在做Streams教程练习(来自Oracle),不知道为什么会出现这个编译器错误(EclipseIDE)


无法推断map(函数)的类型参数
map
旨在将每个输入A映射到结果B

System.out.println(String)返回
void
,即nothing。因此,它不适合作为
map
的参数


即使允许,
map
也不是一个终端操作。所有流都必须以终端操作结束,否则它们将什么也不做。

因为
map
需要一个返回值的函数,而
forEach
不需要。使用map的正确方法是收集并打印输出。
List collect=List。stream().map(String::toUpperCase).collect(Collectors.toList());
我也尝试了
peek(System.out::println)
但它没有打印任何内容。这是因为
peek
是一个非终端操作,在终端操作从流中提取数据之前,它不会执行任何操作。我也尝试过
peek
,但它不起作用。@likejudo
peek
不是终端操作。您需要一个终端操作来创建流功能正常。无终端操作==>无计算。
forEach
是终端。
peek
map
过滤器
不是。阅读文档。
Cannot infer type argument(s) for <R> map(Function<? super T,? extends R>)
/**
  * Create a new list with all the strings from original list converted to 
  * lower case and print them out.
  */
private void exercise1() {
    List<String> list = Arrays.asList(
        "The", "Quick", "BROWN", "Fox", "Jumped", "Over", "The", "LAZY", "DOG");

    list.stream().map(String::toUpperCase).map(System.out::println);
}