java - 如何在流迭代期间使用丰富(外部)调用?

标签 java java-stream

在迭代流期间使用丰富(外部)API 调用是否可以?

例如下面的代码片段:

User[] fullUsers = plainUsers.stream().map(user -> {
        user.setComments(restAPI.getUserComments(user.getId()));
        return user;
    }).toArray();

这里我们看到对一些外部restAPI系统的调用来填充用户实体中的字段。

这种方法好吗?或者在处理丰富/外部系统时我们应该采用不同的方法?

最佳答案

流是一种函数式习惯用法,函数式代码应该努力做到不可变且没有副作用。修改流项目不是一个好的做法。这在技术上是可行的,但我肯定会在代码审查中标记它。

map()的目的是将对象转换为新对象。它不是对现有对象进行适当的修改。这是一种代码味道,您正在返回传入的对象。

我建议使用forEach()。它被设计成有副作用。

plainUsers.forEach(user -> user.setComments(restAPI.getUserComments(user.getId()));
User[] fullUsers = plainUsers.toArray(new User[0]);

或者,显式的 for 循环也可以工作:

for (User user: plainUsers) {
    user.setComments(restAPI.getUserComments(user.getId()));
}

User[] fullUsers = plainUsers.toArray(new User[0]);

关于java - 如何在流迭代期间使用丰富(外部)调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59667269/

相关文章:

java - 使用过滤器将java for循环转换为流

Java流将数组收集到一个列表中

Kotlin 如何在 kotlin 中使用 java 流 .map() 来映射不同的对象响应

Java 将文本文件读取到流中并将其拆分

java - 为什么在某些情况下 Java Stream.forEach 方法比其他循环更快?

java - 对数组使用泛型

java - 重定向过滤器不会加载样式

java - 如何查看jar文件中的文件数量

java - 如何将底部导航与抽屉导航一起使用

java - 使用 Gson 反序列化对象时字段异常的无效值