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());