如何将Java嵌套遍历计数的业务代码改写为lambda表达式?
业务逻辑Lambda表达式改写方案
需求说明
遍历listRegistrationTypeWork列表,检查每个元素的子列表getRegistrationTypeWorkAuthors是否非空,若不为空则遍历该子列表,查找authorCoautor等于指定type的记录并累加计数,统计所有符合条件的记录总数。
原有实现代码
public int qtyMaximumWorksByAuthorCoauthor(AuthorCoauthor type) { int count = 0; for (RegistrationTypeWork tab : listRegistrationTypeWork) { if (CollectionUtils.isNotEmpty(tab.getRegistrationTypeWorkAuthors())) { for (RegistrationTypeWorkAuthors author : tab.getRegistrationTypeWorkAuthors()) { if (author.getAuthorCoauthor().equals(type)) count++; } } } return count; }
Lambda改写实现(基于Java Stream API)
和原有业务逻辑完全对齐,写法更简洁:
public int qtyMaximumWorksByAuthorCoauthor(AuthorCoauthor type) { return listRegistrationTypeWork.stream() // 过滤子列表非空的元素 .filter(tab -> CollectionUtils.isNotEmpty(tab.getRegistrationTypeWorkAuthors())) // 展开所有子列表的作者元素 .flatMap(tab -> tab.getRegistrationTypeWorkAuthors().stream()) // 匹配指定type的记录 .filter(author -> type.equals(author.getAuthorCoauthor())) // 统计符合条件的总数 .count(); }
可选优化
如果不想依赖CollectionUtils工具类,可以把过滤条件替换为原生写法,效果完全一致:.filter(tab -> tab.getRegistrationTypeWorkAuthors() != null && !tab.getRegistrationTypeWorkAuthors().isEmpty())
内容的提问来源于stack exchange,提问作者Romeu Fernandes Bessa
相关产品推荐
相关产品推荐

