gpt4 book ai didi

java - For 循环到 Stream

转载 作者:搜寻专家 更新时间:2023-11-01 03:20:43 25 4
gpt4 key购买 nike

我正在学习 Streams 和 ParallelStreams,现在我正在尝试应用它。我正在将包含 for 循环的代码更改为 streams 但我无法更改代码的某些部分。首先,是否可以将此代码缩减为 Streams?

使用foreach循环

private List<BasicDBObject> linhaCriativa(List<BasicDBObject> linhas) {
List<BasicDBObject> lista = new ArrayList<>();
for (BasicDBObject db : linhas) {
if (!db.toMap().containsKey("spec_linha-criativa")) {
lista.add(db);
continue;
}
String[] linhaCriativa = db.get("spec_linha-criativa").toString().split(";");
if (linhaCriativa.length > 0) {
for (String criativa : linhaCriativa) {
BasicDBObject dbObject = (BasicDBObject) db.copy();
dbObject.replace("spec_linha-criativa", criativa);
lista.add(dbObject);
}
} else {
lista.add(db);
}
}
return lista;
}

我可以这样做,但是当 db.toMap().containsKey("spec_linha-criativa") 时我不能这样做

List<BasicDBObject> notContains = linhas.parallelStream().filter(m -> !m.toMap().containsKey("spec_linha-criativa")).collect(Collectors.toList());

最佳答案

如果我正确理解您的代码,对于输入列表中的每个 BasicDBObject,您提取一个或多个 BasicDBObject,并将它们添加到输出列表。

这是一个flatMap()操作:

return linhas.stream()
.flatMap(this::extractOutputDbObjectsFrom)
.collect(Collectors.toList());

现在您需要创建 extractOutputDbObjectsFrom 方法:

private Stream<BasicDBObject> extractOutputDbObjectsFrom(DbObject db) {
if (!db.toMap().containsKey("spec_linha-criativa")) {
return Stream.of(db);
}

String[] linhaCriativa = db.get("spec_linha-criativa").toString().split(";");
if (linhaCriativa.length > 0) {
return Arrays.stream(linhaCriativa).map(criativa -> {
BasicDBObject dbObject = (BasicDBObject) db.copy();
dbObject.replace("spec_linha-criativa", criativa);
return dbObject;
});
} else {
return Stream.of(db);
}
}

(未经测试,但你应该明白)

关于java - For 循环到 Stream,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31270593/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com