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

How can I do multiple chained operations in java-8?

我有一个用例如下。

  1. List<Document> 来自 mongo
  2. 每个Document

    1. 获取字段

    2. 加入集合

    3. 修改字段

    4. 对照另外两组检查更改的字段

      1. 如果不存在则转换为 pojo

      2. 将 pojo 添加到列表

我有如下内容。

Optional.ofNullable(documentList).orElseGet(Collections::emptyList).forEach(doc -> {
      // I am doing all the operations in java7 way
})

我的想法与下面类似。

  1. 迭代文档列表 - 将字段添加到集合中
  2. 迭代步骤 1 中的集合 - 检查 field 不包含在其他两个集合中 - 然后从原始文档形成 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?