尝试映射列表时出现不兼容类型错误

3
我有一个FeeAccount列表需要填充。我想使用.stream.map()来完成这个任务。我已经编写了一个方法,可以映射我的列表并返回它。我使用了一些我在网上找到的其他示例编写了这段代码。我的问题是,它返回了一个与List不兼容的列表。
我收到了错误信息:类型不兼容。需要 List 但是“map”推断为 Stream:不存在类型变量R的实例,以便Stream符合List 据我所知,问题出在我使用collect(Collectors.toList())的部分。但我不确定。我甚至没有清楚地理解错误消息的含义。
或许有人可以解释一下我做错了什么?是 .stream.map() 的问题吗?因为我之前从未使用过它。还是问题出在其他地方?
Method(List<contract> contractList){
 List<FeeAccount> feeAccounts = new ArrayList<>();

    feeAccounts = contractList
            .stream()
            .map(contract -> {

                List<Fee> monthlyFees=...;

                return monthlyFees.stream()
                        .map(monthlyFee -> {
                            FeeAccount account = new FeeAccount();
                            account.setFeeCode(monthlyFee.getFeeCode());
                            account.setDebtorAccount(contract.getDebtorAccount());
                            return account;
                        }).collect(Collectors.toList());
            });}

1
你拿到一个列表。你将其流式处理。你映射其中的每个合约到一个列表中。这样,你就得到了一个列表流。列表流不是一个列表。因为...部分缺失,所以不确定你真正想做什么。最好编辑问题并发布一个适当的 [mcve]。 - RealSkeptic
@RealSkeptic,...部分不重要,只是想展示monthlyFees列表已经被填充,它不是空的,抱歉误导了您。我现在已经得到答案了,谢谢! - developer1
2个回答

3
您有两个嵌套的 map 操作。外部将一个 contract 转换为一个 List<FeeAccount>,内部将一个 Fee 转换为一个 FeeAccount
因此,您的流水线会产生一个没有终端操作的 Stream<List<FeeAccount>>
如果在末尾添加 .collect(Collectors.toList()),则会得到一个 List<List<FeeAccount>>
如果您想将所有这些内部列表合并为单个输出列表,则应使用 flatMap
为了获得平坦的 List
List<FeeAccount> feeAccounts = 
    contractList.stream()
                .flatMap(contract -> {
                    List<Fee> monthlyFees=...;
                    return monthlyFees.stream()
                                      .map(monthlyFee -> {
                                          FeeAccount account = new FeeAccount();
                                          account.setFeeCode(monthlyFee.getFeeCode());
                                          account.setDebtorAccount(contract.getDebtorAccount());
                                          return account;
                                      });
                })
                .collect(Collectors.toList();

谢谢您解释得如此详细。我已经成功修复了它,现在它运行得很好。我需要阅读更多关于flatMap和普通map之间的区别。 - developer1

1

map() 是流水线中的一个中间操作(请参阅流操作和流水线),它返回一个流。

feeAccounts = contractList
           .stream()
           .map(...) // result of this operation is Stream<<List<FeeAccount>> 
and not a List<FeeAccount>

您缺少终端操作,例如.collect(Collectors.toList()
List<FeeAccount> feeAccounts = contractList
           .stream()
           .flatMap(monthlyFees -> monthlyFees.stream()
                        .map(monthlyFee -> {
                            FeeAccount account = new FeeAccount();
                            account.setFeeCode(monthlyFee.getFeeCode());
                            account.setDebtorAccount(contract.getDebtorAccount());
                            return account;
                        })
           .collect(Collectors.toList());

flatMapStream<Stream<FeeAccount>> 转换为仅包含 Stream<FeeAccount> 的流


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接