是否有用于简单列表映射的 Java 8 实用程序?

Is there a Java 8 utility for simple list mapping?

我想在 List<T> 上做一个非常简单的映射,以通过 lambda 提取 R 类型的单个值,并 return 一个新的 List<R>

或者举一个更具体的例子,如果我有一个 List<Person> people 并且我想通过 Person::getName:

将它转换成 List<String>

我可以用这样的代码来做到这一点:

people.stream().map(Person::getName).collect(Collectors.toList());

或者甚至创建我自己的效用函数:

public static <T,R> List<R> simpleMap(List<T> source, Function<T, R> accessor) {
    return source.stream().map(accessor).collect(Collectors.toList());
}
simpleMap(people, Person::getName)

但我想知道我是否错过了执行此操作的标准 Java 8 实用程序?

没有比stream-map-collect更简单的了Java 8.设计者不想在集合中混合中间和终端操作API。

这是惯用语:从列表中获取一个流,应用映射函数并收集结果。

您可以通过对

的静态导入来减少它
import static java.util.stream.Collectors.toList;
...

List<String> peopleName = list.stream().map(Person::getName).collect(toList());

AFAIK 没有实用方法,因为流方法编写起来相当短,定义此类方法会导致 API 爆炸。

此外,可能值得看看已经定义了 a transform method:

的 Guava API
import static com.google.common.collect.Lists.transform;
...

List<String> peopleName = transform(people, Person::getName);

你可以用一种方法在流中完成。看起来并没有简单得多的想法。

import static java.util.stream.Collectors.toList;
import static java.util.stream.Collectors.mapping;


List<String> peopleName = list.stream().collect(mapping(Person::getName, toList()));