reportNames.stream().map(reportName -> {
if(reportName.equalsIgnoreCase("品番別明細表")) {
List<String> parts = fetchParts(form.getFacility(), form.getYear(), form.getMonth());
return parts.stream().map(part ->
ExcelReportForm.builder().facility(form.getFacility())
.month(form.getMonth())
.year(form.getYear())
.partNumber(part)
.build()
);
} else {
return Collections.singletonList(ExcelReportForm.builder().facility(form.getFacility())
.month(form.getMonth())
.year(form.getYear())
.partNumber("")
.build());
}
}).flatMap(List::stream)
.collect(Collectors.toList());
基本上我想做的是-我试图将Stream<Object>
映射到Stream<Stream<Object>>
中,但是不知为何lambda无法理解基础类型,并在.flatMap(List::stream)
上引发错误
错误显示Non static method cannot be referenced from static context
。
我想知道是什么原因造成的。有人可以帮我吗?
更新
我想出了@nullpointer指出的答案。 从lambda表达式中提取了一个单独的方法后,我意识到了代码的问题。新答案位于下面-
reportNames.stream()
.map(reportName -> mapReportNameToFormParams(form, reportName))
.flatMap(stream -> stream)
.collect(Collectors.toList());
答案 0 :(得分:1)
原因是您的map
操作返回的类型是Stream<T>
,而不是List<T>
。
从
推论以上return parts.stream().map(part ->
ExcelReportForm.builder().facility(form.getFacility())
.month(form.getMonth())
.year(form.getYear())
.partNumber(part)
.build()
);
您可以收集以上内容以返回List<T>
,然后继续使用当前代码,也可以将flatMap
应用于Stream<Stream<T>>
,而可以使用身份操作:>
.flatMap(s -> s)