【问题标题】:Java Streams : Using println with map and forEach [duplicate]Java Streams:将println与map和forEach一起使用[重复]
【发布时间】:2020-03-27 21:33:25
【问题描述】:

我开始使用流并面临以下问题:

ArrayList<Integer> al = new ArrayList<Integer>();
al.add(10);
al.add(20);
al.add(30);

al.stream().forEach(System.out::println); // This works

al.stream().map(System.out::println); // This fails with error as "Incompatible types: expected not void but compile-time declaration for method reference has void return type"

有人可以解释一下吗?

【问题讨论】:

  • map 采用 Function 将流的元素类型转换为其他类型。 void-returning println 能做到吗?
  • map 需要一个函数。 System.out.println() 是消费者而不是函数
  • map 返回一个值。所以它接受一个返回值的函数。 System.out.println() 不返回任何内容。
  • 或者,用更简单的话来说,这是因为map 是与forEach 不同的方法,目的完全不同,没有理由像forEach 那样行事。

标签: java java-stream


【解决方案1】:

用简单的英语方式:

forEach 对流的每个元素应用一个具有副作用的方法,这是一个 terminal 操作,它不返回任何内容:

...
.forEach(thisElement -> doThatWith(thisElement))

例子:

.forEach(thisElement -> System.out.println(thisElement))
.forEach(thisElement -> aList.add(thisElement))

map 应用一种将流的每个元素转换为另一个对象并返回Stream&lt;NewObjectClass&gt; 的方法:

...
.map(thisElement -> transformIntoAnotherElement(thisElement))

例子:

.map(thisElement -> String.valueOf(thisElement)) // returns Stream<String>
.map(thisElement -> new MyObject(thisElement)) // returns Stream<MyObject>

【讨论】:

    【解决方案2】:

    map() 将一种类型的元素的Stream 转换为另一种类型的元素的Stream

    因此,您必须将 Function 传递给 map(),它将原始类型的元素转换为新类型。 System.out::println 不适合 Function 功能接口,因为它有一个 void 返回类型。

    即使您将有效的Function 传递给map(),它也不会应用于Stream 的任何元素,因为您的第二个Stream 管道没有终端操作。

    【讨论】:

      猜你喜欢
      • 2016-12-20
      • 2021-09-03
      • 1970-01-01
      • 2014-07-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-28
      • 1970-01-01
      相关资源
      最近更新 更多