Stream.map不转换为流Stream

时间:2019-02-25 06:25:37

标签: java lambda java-stream

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

1 个答案:

答案 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)