【问题标题】:Return List from forEach using Stream in java在java中使用Stream从forEach返回列表
【发布时间】:2018-12-11 15:46:18
【问题描述】:
我正在尝试使用 Java1.8 将下面的 for-loop 转换为 forEach 方法,并使用帮助 Stream 函数,但我搞砸了,也很困惑。
List<A> valueList = new ArrayList<>();
List<B> responseList = getResponses();
List<A> value = new ArrayList<>();
for (B getResponse: responseList) {
valueList = getValues(getResponse);
value.addAll(valueList);
}
【问题讨论】:
标签:
java
foreach
java-8
java-stream
【解决方案1】:
对于流,您通常希望避免创建空列表然后添加项目。 Streams 应该使用函数式惯用语,并尽可能避免副作用。最好将流作为一个整体处理,然后将结果“收集”到最后的列表中。
List<C> value = getResponses().stream()
.flatMap(r -> getValues(r).stream())
.collect(Collectors.toList());
【解决方案2】:
我正在尝试在帮助下将下面的 for 循环转换为 forEach 方法
使用 Java 1.8 的流函数。
您不应该将流与forEach 一起使用,因为这会产生副作用(在处理流时应避免),而应使用 John Kugelman 建议的流方法,如果您想使用流或使用forEach 方法执行它,也可以这样做:
List<A> value = new ArrayList<>();
responseList.forEach(response -> value.addAll(getValues(response))));
【解决方案3】:
您似乎正在尝试将responseList 中的所有值添加到valueList,我认为您可以只执行valueList.addAll(responseList); 而根本不必使用for 循环。
如果类型 B 不从 A 继承,你可能会遇到问题,因为你不能有两个不相关类型的列表。