是否有用于简单列表映射的 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()));
我想在 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 APIimport 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()));