有一个客户。客户有多个帐户。每个帐户都有多张与之关联的卡。要获取所有客户卡的列表,我这样做:
List<Card> allCards = new ArrayList<>();
List<Account> accounts = client.getAccounts();
for (Account a : accounts) {
List<Card> cards = a.getCards();
allCards.addAll(cards);
}
log.debug("Все карты клиента: " + allCards);
有没有办法通过流媒体做到这一点?像这样:
List<Card> allCards2 = client.getAccounts()
.stream()
.map(account -> account.getCards().stream())
.reduce() // тут ошибка, красным подсвечивает
.collect(Collectors.toList());
试试平面地图
例如,假设有一个类
我们抛出一个包含数据的列表
并处理卡片
结论
reduce
并且collect
是流中的终端操作,因此不能同时使用。要解决这个问题,最简单的方法是在源代码中替换为
.map
和.flatMap
删除reduce
,留下collect
:或者它可以用于
map
将发票流转换为卡片列表流,您已经可以申请reduce
获取卡片的一般列表。此解决方案的主要缺点是标准方法List::addAll
返回boolean
,因此对该方法的引用不能直接用作 asBinaryOperator<List<Card>>
,您需要编写一个单独的 lambda / 函数: