【问题标题】:Why forEach(System.out::println) works but map(System.out::println) fails? [duplicate]为什么 forEach(System.out::println) 有效但 map(System.out::println) 失败? [复制]
【发布时间】:2020-07-28 13:03:54
【问题描述】:

我正在做 Streams 教程练习(来自 Oracle)并想知道为什么我会收到此编译器错误(Eclipse IDE)。

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

我也试过peek(System.out::println),但它没有打印出任何东西。 我不明白为什么 forEach(System.out::println) 有效但 map(System.out::println) 失败。

【问题讨论】:

  • 因为map 想要一个返回值的函数,而forEach 不需要。
  • 使用 map 的正确方法是收集输出并打印出来。 List&lt;String&gt; collect = list.stream().map(String::toUpperCase).collect(Collectors.toList());
  • 我也试过peek(System.out::println),但它没有打印出任何东西。
  • 那是因为peek 是一个非终端操作,在终端操作从流中提取数据之前,它不会做任何事情。

标签: java java-8 java-stream


【解决方案1】:

map 旨在将每个输入 A 映射到结果 B。

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

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

【讨论】:

  • 我也试过peek,但没用。
  • @likejudo peek 不是终端操作。您需要一个终端操作才能使流正常工作。没有终端操作 ==> 没有计算。 forEach 是终端。 peekmapfilter 不是。阅读文档。
猜你喜欢
  • 2015-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-19
  • 2020-03-27
  • 2015-11-24
  • 1970-01-01
相关资源
最近更新 更多