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

时间:2015-03-10 09:00:27

标签: java java-8

我希望在List<T>之间做一个非常简单的地图,通过lambda提取R类型的单个值,然后返回一个新的List<R>

或者更具体的例子,如果我有一个List<Person> people,我想通过List<String>将其转换为Person::getName

我可以使用以下代码执行此操作:

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实用程序来执行此操作?

3 个答案:

答案 0 :(得分:4)

这是通常的习惯用法:从列表中获取流,应用映射函数并收集结果。

您可以通过静态导入

来减少它
import static java.util.stream.Collectors.toList;
...

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

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

此外,可能值得查看已定义a transform method

import static com.google.common.collect.Lists.transform;
...

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

答案 1 :(得分:1)

您可以使用一种方法在线上完成。看起来并不简单。

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


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

答案 2 :(得分:0)

没有什么比Java 8中的stream-map-collect更简单。设计人员不希望在集合API中混合使用中间操作和终端操作。