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

时间:2015-03-02 12:45:36

标签: java lambda java-8

我开始学习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),并且对于每个实体我想设置对象的一个​​属性的值,然后返回已经填充的集合。

好吧,我想用java 8的新API做到这一点,但我收到一个编译错误,说“不兼容的类型,必需的List,发现无效”,这基本上告诉我终端方法forEach不返回什么,但它期望返回句子中声明的List。

如果forEach方法返回void,如何迭代列表并返回已填充的列表? 任何想法如何解决这个问题,或者其他方式如何解决这个问题? (当然除了典型的(TT021OrderDetails orderDetail:entitiesList){...})

非常感谢您提前

3 个答案:

答案 0 :(得分:4)

您可以使用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。

答案 1 :(得分:0)

像提到的forEach一样返回void。要实现您的目标,请使用map


newList = yourList.stream().map(o -> {do whatever you want}).collect(Collectors.toList());

答案 2 :(得分:0)

每次返回无效。您可以简单地遍历流,而无需将结果分配给列表。

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