java流中的映射与应用

java流中的映射与应用,java,lambda,java-8,java-stream,Java,Lambda,Java 8,Java Stream,我现在有下面这样的东西 List<String> myNewList = myList .stream() .map(item->{ return mappedItem }) .collect(Collect

我现在有下面这样的东西

List<String> myNewList = myList
                           .stream()
                           .map(item->{
                             return mappedItem
                           })
                           .collect(Collectors.toList());
repository.save(myNewList);
myOptional
  .map(item -> {
    return mappedItem
  })
  .ifPresent(newItem -> {
    repository.save(newItem);
  });
我想知道我是否可以在网上做类似的事情。有没有办法收集新的
列表
并在新列表上应用我的功能,而不是声明
myNewList

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

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

您可以按如下方式创建自定义收集器:

myList.stream().map(..)
      .collect(Collectors.collectingAndThen(Collectors.toList(), repository::save));
如果
save
返回类型为
void
,则会更加难看,因为您需要从
collect
返回某些内容:

myList.stream().map(..)
      .collect(Collectors.collectingAndThen(Collectors.toList(), 
              list -> {repository.save(list);return list;}));
您可以在
存储库
类中声明特殊方法:

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

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

重点是什么?如果您不想使用
myNewList
变量,只需将完整的流语句传递到
save
。那么,
myOptional
方法似乎更简洁。将整个流语句包装到另一个函数中会使代码看起来更复杂。实际上,您正在创建一个新的列表,其中包含一个相同的项。这真的是你想要的吗?另外
item->{return mappedItem;}
item->mappedItem
..@assylias谢谢,
return mappedItem
只是一个参考。在我的原始代码中,我有一组语句来确定新的值。谢谢你的回答。
myList.stream().map(..).collect(repository.saving());