如何用Java 8 Streams替换包含服务调用的for循环
解决Java 8 Stream重构问题
我来帮你搞定这个Stream重构的问题~首先得指出你写的代码里的核心问题:错误地使用了filter操作。filter是用来筛选流中符合条件的元素的,而你的需求是把每个User对象转换成调用crowdClient.getUserWithAttributes()后的结果,这时候应该用map操作来做元素转换。
正确的重构代码
private List<User> getFullUserDetails(CrowdClient crowdClient, List<User> unModifiableUserList) { return unModifiableUserList.stream() .map(user -> crowdClient.getUserWithAttributes(user.getName())) .collect(Collectors.toList()); }
代码解释
unModifiableUserList.stream():将不可修改的列表转换成Stream流,开启流式操作.map(user -> crowdClient.getUserWithAttributes(user.getName())):对每个流中的User对象,调用第三方服务获取带属性的完整用户信息,完成元素的转换.collect(Collectors.toList()):将转换后的所有元素收集成一个新的List<User>返回
额外优化(可选)
如果unModifiableUserList可能为null,可以加上空值保护,避免空指针异常:
private List<User> getFullUserDetails(CrowdClient crowdClient, List<User> unModifiableUserList) { return Optional.ofNullable(unModifiableUserList) .orElse(Collections.emptyList()) .stream() .map(user -> crowdClient.getUserWithAttributes(user.getName())) .collect(Collectors.toList()); }
这个重构后的代码和你原来的for循环逻辑完全一致,而且更符合Java 8+的流式编程风格,简洁优雅。
内容的提问来源于stack exchange,提问作者nanospeck
相关产品推荐
相关产品推荐

