3VY*_*z7t 13 java java-8 java-stream
假设我们有一个如下列表.CoreResult有一个类型的领域List<Double>.
final List<CoreResult> list = new LinkedList<>(SOME_DATA);
Run Code Online (Sandbox Code Playgroud)
目标是在从每个CoreResult对象中提取特定字段后展平列表.这里有3种可能的选择.他们中的任何一个比其他人更好吗?
选项1:通过map()收集器提取字段并展平收集器内部
final List<Double> A = list.stream().map(CoreResult::getField)
.collect(ArrayList::new, ArrayList::addAll, ArrayList::addAll);
Run Code Online (Sandbox Code Playgroud)
选项2:map()通过flatMap()简单的收集器提取字段
final List<Double> B = list.stream().map(CoreResult::getField)
.flatMap(Collection::stream).collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)
选项3:通过flatMap()简单的收集器提取一个字段并平整
final List<Double> C = list.stream().flatMap(
x -> x.getField().stream()).collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)
如果不需要从CoreResult中提取任何字段,那么答案是否会有所不同,而是想要简单地将其展平List<List<Double>>?
Zir*_*con 21
我不确定每个的性能,但java流使用的构建器模式的一个重要方面是它允许可读性.我个人认为选项2是最具可读性的.选项3也很好.我会避免选择一,因为它有点"欺骗"收藏品的扁平化.
将每个方法放在自己的行上,并确定哪个方法最直观.我更喜欢第二个:
final List<Double> B = list.stream()
.map(CoreResult::getField)
.flatMap(Collection::stream)
.collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)
我会选择选项2或3.如果你想要压扁a List<List<Double>>,你会这样做:
List<Double> list = doubleList.stream()
.flatMap(List::stream)
.collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)