使用Java 8的Streams和Lambdas表达式迭代集合时出现问题



我开始学习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

最新更新