Display and apply in java stream

I currently have something like below

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

Optionally, I can perform operations on the displayed item using the ifPresent method, as shown below

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

I was wondering if I can do something like this above. Instead of declaring myNewList, is there a way I can put together a new one Listand apply my function in a new list?

Update. Based on the answer from @ tagir-valeev, I changed my code below

myList
  .stream()
  .map(item->{
    return mappedItem
  })
  .collect(Collectors.collectingAndThen(Collectors.toList(),
    list -> {
      repository.save(list);
      return list;
    }
  ));
+4
source share
1 answer

You can create your own custom collector as follows:

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

save return type is void, , - collect:

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

Repository:

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

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

:

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

Source: https://habr.com/ru/post/1613672/


All Articles