Java lambda expression — mapping and then modifying a list?

后端 未结 2 1984
花落未央
花落未央 2020-12-19 19:30

Using a Java 8 lambda expression, I\'m trying to do something like this.

List objs = ...;
for (OldObject oldObj : oldObjects) {
  NewObject          


        
相关标签:
2条回答
  • 2020-12-19 20:23

    You can use peek.

    List<NewObject> list = oldObjects.stream()
                                     .map(OldObject::toNewObject)
                                     .peek(o -> o.setOrange(true))
                                     .collect(Collectors.toList());
    

    Alternatively, you can mutate the elements after forming the list.

    List<NewObject> list = oldObjects.stream()
                                     .map(OldObject::toNewObject)
                                     .collect(Collectors.toList());
    list.forEach(o -> o.setOrange(true));
    
    0 讨论(0)
  • 2020-12-19 20:25

    You can use Stream's peek method, which returns the Stream because it's an intermediate operation. It normally isn't supposed to have a side effect (it's supposed to be "non-interfering"), but in this case, I think the side effect (setOrange(true)) is intended and is fine.

    List<NewObject> newObjects =
        oldObjects.stream()
            .map(OldObject::toNewObject)
            .peek( n -> n.setOrange(true))
            .collect(Collectors.toList());
    

    It's about as verbose as your non-streams code, so you can choose which technique to use.

    0 讨论(0)
提交回复
热议问题