Java 3种展平列表的方法。有理由选择其中一个吗?

Java 3种展平列表的方法。有理由选择其中一个吗?,java,java-8,java-stream,Java,Java 8,Java Stream,假设我们有如下列表CoreResult有一个类型为List的字段 选项2:通过map()提取字段,通过flatMap()展平,简单收集器 final List<Double> A = list.stream().map(CoreResult::getField) .collect(ArrayList::new, ArrayList::addAll, ArrayList::addAll); final List<Double> B = list.s

假设我们有如下列表
CoreResult
有一个类型为
List
的字段

选项2:通过
map()
提取字段,通过
flatMap()
展平,简单收集器

final List<Double> A = list.stream().map(CoreResult::getField)
            .collect(ArrayList::new, ArrayList::addAll, ArrayList::addAll);
final List<Double> B = list.stream().map(CoreResult::getField)
            .flatMap(Collection::stream).collect(Collectors.toList());
final List<Double> C = list.stream().flatMap(
             x -> x.getField().stream()).collect(Collectors.toList());

如果不需要从CoreResult中提取任何字段,而只是简单地展平
列表,答案会有所不同吗?

选项3和2是相同的,因此,如果您想先映射然后平面映射还是仅平面映射,取决于您


使用选项1,您必须打开另一个流来执行进一步的操作。

我选择选项2或3。如果要展平
列表
,请执行以下操作:

List<Double> list = doubleList.stream()
                              .flatMap(List::stream)
                              .collect(Collectors.toList());
List List=doubleList.stream()
.flatMap(列表::流)
.collect(Collectors.toList());

我不确定每种模式的性能,但java streams使用的构建器模式的一个重要方面是它允许可读性。我个人认为选项2最具可读性。选择3也很好。我会避免选择一,因为它“欺骗”了收藏的扁平化

将每种方法放在各自的行上,并确定哪种方法最直观易读。我比较喜欢第二个:

final List<Double> B = list.stream()
                           .map(CoreResult::getField)
                           .flatMap(Collection::stream)
                           .collect(Collectors.toList());
final List B=List.stream()
.map(CoreResult::getField)
.flatMap(集合::流)
.collect(Collectors.toList());

如果您关心性能,则不应使用
LinkedList
。由于
某些数据必须已经是一个集合,所以将其复制到另一个
列表中是没有意义的。因此,首选的方法是
SOME_DATA.stream()。/*无论您喜欢哪三个选项*/
…我在.flatMap(List::stream)行上遇到“非静态方法无法从静态上下文引用”编译错误
final List<Double> B = list.stream()
                           .map(CoreResult::getField)
                           .flatMap(Collection::stream)
                           .collect(Collectors.toList());