如何在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文档
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
})
字段
不包含-然后从原始文档形成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。“此方法的存在主要是为了支持调试”