我开始学习Java 8流和lambdas表达式。我想迭代一个集合,但遇到了编译错误。我理解为什么会发生这个错误,但我不知道如何消除它。下面的代码:
List<TT021OrderDetails> entitiesList =BeanAdapter.getInstance().transformToEntityList(
TT021OrderDetails.class, positionsList);
entitiesList=(CollectionUtils.isNotEmpty(entitiesList))?entitiesList.stream().forEach(orderDetail->orderDetail.setOrderHeader(entity)):null;
因此,我需要迭代集合entitiesList(如果它不为null),并且对于每个实体,我希望设置对象的一个属性的值,然后返回已经填充的集合。
好吧,我想使用新的Java8 API来实现这一点,但我收到了一个编译错误,上面写着"不兼容的类型,必需的List,找到了void",这基本上是告诉我,forEach的终端方法不返回任何内容,但它希望返回句子中声明的List。
如果forEach方法返回void,如何迭代列表并返回已填充的列表?你知道如何解决这个问题,或者用其他方法解决这个问题吗?(当然,除了典型的(TT021OrderDetails orderDetail:entities List){…})
提前非常感谢
您可以使用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。
类似于为Each提到的fge返回void。要实现您正在寻找的使用地图。
newList = yourList.stream().map(o -> {do whatever you want}).collect(Collectors.toList());
For each返回void。您可以简单地遍历一个流,而无需将结果分配给列表。
if (CollectionUtils.isNotEmpty(entitiesList)){
entitiesList.stream().forEach(orderDetail->orderDetail.setOrderHeader(entity))
}
JDK8forEach:教程
http://www.adam-bien.com/roller/abien/entry/java_8_from_a_for