我有一个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());
});}
答案 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());
flatMap将Stream<Stream<FeeAccount>>
转换为Stream<FeeAccount>