我找不到答案。我尝试将多个对象合并为一个。示例模型
public class Model {
private List<Map<String, Object>> param1;
private List<String> param2;
}
在我的代码中,我将另一个数据转换为模型。
List<Model> models = models2.stream()
.map(Optional::get)
.map(model2 -> convert(model2))
.collect(Collectors.toList());
我尝试将转换后的模型列表聚合为一个模型。喜欢:
Model model = models2.stream() ...etc
但我不知道怎么做。
最简单的方法是将merge
方法添加到Model
类中:
public class Model {
private List<HashMap<String, Object>> param1;
private List<String> param2;
public Model merge (Model other) {
this.param1.addAll(other.param1);
this.param2.addAll(other.param2);
return this;
}
}
然后reduce
您的流:
Model allInOne = models2.stream()
.map(Optional::get)
.map(model2 -> convert(model2))
.reduce(Model::merge)
.get();
该merge
方法也可以是static Model merge (Model first, Model second)
或外部化的BinaryOperator<Model>
函数。
首先,您当前的代码包含一个隐藏的不明显的错误。当遇到空Optional
时,操作Optional::get
将引发异常。您应该先过滤掉空的可选:
// ...
.filter(Optional::isPresent)
.map(Optional::get)
// ...
或者,如果您使用的是java-9
或更高版本,则可以简单地平面映射可选值:
// ...
.flatmap(Optional::stream)
// ...
至于你的问题,看起来你需要reduce
合并功能。有不同的方法可以定义该函数:
方法参考:
private Model merge(Model model1, Model model2) { // merge model2 to model1 return model1; } Model model = models2.stream() .filter(Optional::isPresent) .map(Optional::get) .map(this::convert) .reduce(this::merge) .orElse(defaultModel);
存储在变量中的
BinaryOperator
:BinaryOperator<Model> merge = (model1, model2) -> { /* do smth */; return model1;} // ... .map(this::convert) .reduce(merge) //
内联
lambda
// ... .map(this::convert) .reduce((model1, model2) -> { /* do smth */; return model1;}) //
恕我直言,第一个选项是最好的选择。使用单独的方法将使代码更简洁,更易于维护。