我希望在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实用程序来执行此操作?
答案 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中混合使用中间操作和终端操作。