使用 Java 8 的 Streams 和 Lambdas 表达式迭代集合
Issue iterating a collection using Streams and Lambdas expressions of Java 8
我开始学习 Java 8 种流和 lambda 表达式。
我想迭代一个集合,但出现编译错误。我明白为什么会发生这个错误,但我不知道如何摆脱它。代码下方:
List<TT021OrderDetails> entitiesList =BeanAdapter.getInstance().transformToEntityList(
TT021OrderDetails.class, positionsList);
entitiesList=(CollectionUtils.isNotEmpty(entitiesList))?entitiesList.stream().forEach(orderDetail->orderDetail.setOrderHeader(entity)):null;
所以我需要迭代集合 entitiesList(如果它不为空),并且我想为每个实体设置对象的一个属性的值,然后 return 集合已经已满
好吧,我想使用 java 8 的新 API 来做到这一点,但我收到一个编译错误 "Incompatible types, required List, found void",这基本上是告诉我终端forEach 方法不 return 任何东西,但是它期望 return 句子中声明的列表。
如果forEach方法return无效,如何迭代列表并且return列表已经填充?
知道如何解决这个问题,或者其他方法吗? (当然除了典型的 for(TT021OrderDetails orderDetail:entitiesList ){...} )
非常感谢您
您可以使用 peek 而不是 forEach,并使用 collect
作为获取列表的终端操作:
entitiesList=(CollectionUtils.isNotEmpty(entitiesList))?entitiesList.stream().peek(orderDetail->orderDetail.setOrderHeader(entity)).collect(Collectors.toList()):null;
但是,由于您没有更改列表(您只是遍历 entitiesList
并为每个元素调用一个方法),因此不需要整个分配。
随便写:
if (entitiesList != null) {
entitiesList.forEach(orderDetail->orderDetail.setOrderHeader(entity));
}
你甚至不需要 Stream。
就像 fge 提到的那样 forEach returns void. To achive what you are looking for use map。
newList = yourList.stream().map(o -> {do whatever you want}).collect(Collectors.toList());
每个returns无效。您可以简单地遍历流,而无需将结果分配给列表。
if (CollectionUtils.isNotEmpty(entitiesList)){
entitiesList.stream().forEach(orderDetail->orderDetail.setOrderHeader(entity))
}
JDK8 forEach 教程:
http://www.adam-bien.com/roller/abien/entry/java_8_from_a_for
我开始学习 Java 8 种流和 lambda 表达式。 我想迭代一个集合,但出现编译错误。我明白为什么会发生这个错误,但我不知道如何摆脱它。代码下方:
List<TT021OrderDetails> entitiesList =BeanAdapter.getInstance().transformToEntityList(
TT021OrderDetails.class, positionsList);
entitiesList=(CollectionUtils.isNotEmpty(entitiesList))?entitiesList.stream().forEach(orderDetail->orderDetail.setOrderHeader(entity)):null;
所以我需要迭代集合 entitiesList(如果它不为空),并且我想为每个实体设置对象的一个属性的值,然后 return 集合已经已满
好吧,我想使用 java 8 的新 API 来做到这一点,但我收到一个编译错误 "Incompatible types, required List, found void",这基本上是告诉我终端forEach 方法不 return 任何东西,但是它期望 return 句子中声明的列表。
如果forEach方法return无效,如何迭代列表并且return列表已经填充? 知道如何解决这个问题,或者其他方法吗? (当然除了典型的 for(TT021OrderDetails orderDetail:entitiesList ){...} )
非常感谢您
您可以使用 peek 而不是 forEach,并使用 collect
作为获取列表的终端操作:
entitiesList=(CollectionUtils.isNotEmpty(entitiesList))?entitiesList.stream().peek(orderDetail->orderDetail.setOrderHeader(entity)).collect(Collectors.toList()):null;
但是,由于您没有更改列表(您只是遍历 entitiesList
并为每个元素调用一个方法),因此不需要整个分配。
随便写:
if (entitiesList != null) {
entitiesList.forEach(orderDetail->orderDetail.setOrderHeader(entity));
}
你甚至不需要 Stream。
就像 fge 提到的那样 forEach returns void. To achive what you are looking for use map。
newList = yourList.stream().map(o -> {do whatever you want}).collect(Collectors.toList());
每个returns无效。您可以简单地遍历流,而无需将结果分配给列表。
if (CollectionUtils.isNotEmpty(entitiesList)){
entitiesList.stream().forEach(orderDetail->orderDetail.setOrderHeader(entity))
}
JDK8 forEach 教程:
http://www.adam-bien.com/roller/abien/entry/java_8_from_a_for