map and apply in java stream

时间:2015-10-29 15:46:04

标签: java lambda java-8 java-stream

I currently have something like below

List<String> myNewList = myList
                           .stream()
                           .map(item->{
                             return mappedItem
                           })
                           .collect(Collectors.toList());
repository.save(myNewList);

In Optional, I can perform operations on the mapped item by using ifPresent method like below

myOptional
  .map(item -> {
    return mappedItem
  })
  .ifPresent(newItem -> {
    repository.save(newItem);
  });

I was wondering if I can do something like the above on stream. Rather than declaring myNewList, is there a way I can collect the new List and apply my function on the new list?

Update: Based on the answer from @tagir-valeev, I modified my code as below

myList
  .stream()
  .map(item->{
    return mappedItem
  })
  .collect(Collectors.collectingAndThen(Collectors.toList(),
    list -> {
      repository.save(list);
      return list;
    }
  ));

1 个答案:

答案 0 :(得分:5)

You can create your custom collector like this:

myList.stream().map(..)
      .collect(Collectors.collectingAndThen(Collectors.toList(), repository::save));

If save return type is void, it would be more ugly as you need to return something from collect:

myList.stream().map(..)
      .collect(Collectors.collectingAndThen(Collectors.toList(), 
              list -> {repository.save(list);return list;}));

You may declare special method in your Repository class:

class Repository {
    Collector<MyItemType, ?, List<MyItemType>> saving() {
        return Collectors.collectingAndThen(Collectors.toList(), 
              list -> {this.save(list);return list;});
    }

    void save(List<MyItemType> list) { ... }
}

And use it:

myList.stream().map(..).collect(repository.saving());