映射并在java流中应用

Sri*_*rik 4 java lambda java-8 java-stream

我目前有类似下面的内容

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

在Optional中,我可以使用ifPresent方法对映射项执行操作,如下所示

myOptional
  .map(item -> {
    return mappedItem
  })
  .ifPresent(newItem -> {
    repository.save(newItem);
  });
Run Code Online (Sandbox Code Playgroud)

我想知道我是否可以做上面这样的事情.而不是声明myNewList,有没有一种方法可以收集新的List并在新列表中应用我的功能?

更新:根据@ tagir-valeev的回答,我修改了我的代码如下

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

Tag*_*eev 5

您可以像这样创建自定义收集器:

myList.stream().map(..)
      .collect(Collectors.collectingAndThen(Collectors.toList(), repository::save));
Run Code Online (Sandbox Code Playgroud)

如果save返回类型是void,那么因为你需要返回一些东西会更丑collect:

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

您可以在Repository班级中声明特殊方法:

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

    void save(List<MyItemType> list) { ... }
}
Run Code Online (Sandbox Code Playgroud)

并使用它:

myList.stream().map(..).collect(repository.saving());
Run Code Online (Sandbox Code Playgroud)