java - 从 List<Object> 获取 Map<String, List<Object>> 其中键是对象的字段之一

标签 java dictionary lambda java-8 java-stream

我有一个对象如下

public class Model {
    private String key;
    private String data1;
    private String data2;
    private String data3;

    // getters
}

这些模型的列表正在通过数据层返回。
现在我想创建一个 Map<String, List<Model>>键是 Model 中的“键”字段类(class)。
有多个具有不同数据值的重复“键”。
我有以下现有解决方案,但需要更简单更好的方法。没有广泛使用Java 8,所以对大多数方法不太熟悉,因为我没有时间研究,所以需要尽快找到解决方案。
List<Model> models = modelRepo.getAllModels();
Set<String> keys = models.stream().map(Model::getKey).collect(Collectors.toSet());

Map<String, List<Model>> result = new HashMap<>();
keys.stream().forEach(key -> {
    List<Model> modelList = new ArrayList<>();
    models.stream().forEach(model -> {
        if (model.getKey().equals(key)) {
            modelList.add(model);
        }
    });
    result.put(key, modelList);
});

最佳答案

首先,stream().forEach()可以换成forEach()只要不使用中间操作。

您想要的是 Collectors.groupingBy 的典型用例没有进一步的下游收集器:

Map<String, List<Model>> result = models.stream()     // Stream<Model>
    .collect(Collectors.groupingBy(Model::getKey));   // Map<String, List<Model>>

关于java - 从 List<Object> 获取 Map<String, List<Object>> 其中键是对象的字段之一,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61732540/

相关文章:

java - 使类文件可通过 HTTP 访问

python - 如何将字符串转换为看起来已经是字典的字典?

lambda - 如何将 lambda 表达式放在 mapTo 调用合法语法的参数之后?

java - 以批处理模式从 MySQL 中检索多行的 auto_increment 值

java - 进度条不变

string - 使用字典选择不重叠的最大子串总和

c++ - map : Bad Ptr even if the key was found

c++ - 使用作为 lambda 传递的自定义比较器创建集

c++ - 如何在 gcc 中为未使用的 lambda 表达式启用警告?

java - 自组织模糊神经网络 (SOFNN) 在 Java、C、Python 等中的实现