如何在java-8中执行多个链式操作?

如何在java-8中执行多个链式操作?,java,java-8,mongo-java-driver,Java,Java 8,Mongo Java Driver,我有一个用例如下 Optional.ofNullable(documentList).orElseGet(Collections::emptyList).forEach(doc -> { // I am doing all the operations in java7 way }) 列表来自mongo 对于每个文档 找一块地 添加到集合中 改变场地 对照其他两组检查更改的字段 如果不存在,则转换为pojo 将pojo添加到列表中 我有如下的东西 Optional.ofN

我有一个用例如下

Optional.ofNullable(documentList).orElseGet(Collections::emptyList).forEach(doc -> {
      // I am doing all the operations in java7 way
})
  • 列表
    来自mongo
  • 对于每个
    文档

  • 找一块地

  • 添加到集合中

  • 改变场地

  • 对照其他两组检查更改的字段

  • 如果不存在,则转换为pojo

  • 将pojo添加到列表中

  • 我有如下的东西

    Optional.ofNullable(documentList).orElseGet(Collections::emptyList).forEach(doc -> {
          // I am doing all the operations in java7 way
    })
    
    我的想法与下面类似

    Optional.ofNullable(documentList).orElseGet(Collections::emptyList).forEach(doc -> {
          // I am doing all the operations in java7 way
    })
    
  • 迭代文档列表-向集合中添加字段
  • 迭代步骤1中的集合-检查其他两个集合上的
    字段
    不包含-然后从原始文档形成pojo-将pojo添加到列表
  • 但这里我需要迭代两次。此外,我还需要维护我的原始文档。如果我的列表很大,则不必要地增加迭代时间

    我怎样才能用标准的方式做到这一点

    documentList.forEach(doc -> {
              String deviceId = doc.getString("deviceId");
              deviceSet.add(deviceId);
              String alteredId = "IMEI" + deviceId;
              if(!clearedDevices.contains(alteredId) && !superSetDevices.contains(deviceId)) {
                 //Pojo from Document
                 //add pojo to a list
             }
        })
    

    这取决于相关领域的类型。如果它是一个可变对象,那么Java8流就是完美的。比如:

    documentList.stream()
                .map(d->d.getString("deviceId") // stream of Stringified field
                .peek(deviceSet::add)           // add field to set
                .map("IMEI"::concat)            // alter the field
                .filter(mf->!clearedDevices.contains(mf)&&!superSetDevices.contains(mf)) // filter...
                .map(f->XXX.convert2Pojo(f))    // convert to pojo
                .forEach(pojoList::add)         // add to pojolist, or collect?
    

    如果您可以显示您的代码,即使它是“java7方式”,也会有所帮助。然后我们可以很容易地转换它。@Zabuza添加了我的当前版本,我从java-7方式修改了该版本。“标准方式”是
    if(documentList!=null)for(Document doc:documentList).
    @Holger,那么我的场景不推荐使用java-8功能。是吗?当现有代码没有任何好处时,没有理由重写它。引入了
    可选
    类型,以允许声明可能不存在的返回类型,这与可能为
    null
    的返回类型相比提供了清晰性,后者不明显。没有理由将简单的
    if
    语句重写为更详细的结构。如果要改进代码,请消除集合为
    null
    的可能性。
    forEach
    方法是一个选项,当操作是直接进行的时候,它可以用于新代码;当好处明显时,它可以用于重构。不用于重写每个循环。
    文档
    属于
    org.bson.Document
    。是mongo db一号。字段来自
    文档
    。流API的这种用法是错误的。你永远不应该通过流修改另一个收藏。@Nikolas谁这么说的?这并不是严格禁止的(J8功能不是纯粹的),但我可以承认它可能是危险的。但在很多情况下,这是非常有用的。@Gibbs哦,我误读了提供的代码,需要重写我的代码……这有点误用了peek。“此方法的存在主要是为了支持调试”