模型中的 Java lambda 流合并参数



我找不到答案。我尝试将多个对象合并为一个。示例模型

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合并功能。有不同的方法可以定义该函数:

  1. 方法参考:

    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);
    
  2. 存储在变量中的BinaryOperator

    BinaryOperator<Model> merge = (model1, model2) -> { /* do smth */; return model1;}  
    // ... 
    .map(this::convert)
    .reduce(merge)
    //
    
  3. 内联lambda

    // ... 
    .map(this::convert)
    .reduce((model1, model2) -> { /* do smth */; return model1;})
    //
    

恕我直言,第一个选项是最好的选择。使用单独的方法将使代码更简洁,更易于维护。

最新更新