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

时间:2019-07-10 13:26:51

标签: java list mapping

我有一个FeeAccount列表,我想填写。我想使用.stream.map()完成它。我设法做的是制作一个可以映射我的列表并返回它的方法。我使用网上找到的其他一些示例编写了此代码。我的问题是,它以某种方式返回了与List不兼容的列表。

我收到一个错误:类型不兼容。必需的列表,但“映射”被推断为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());
            });}

2 个答案:

答案 0 :(得分: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();

答案 1 :(得分:1)

map()是流管道中的中间操作(请查看Stream operations and pipelines),这意味着它返回流。

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>