【问题标题】:Get List<String> and HashMap<String, Object> using Java 8 streams使用 Java 8 流获取 List<String> 和 HashMap<String, Object>
【发布时间】:2019-02-26 02:06:41
【问题描述】:

这是我正在处理我的项目的类似内容。类是不同的,原因很明显。假设我有课

public class Division {
    String className;
    Map<String, Student> studentMap;
    // getters and setters      
}

public class Student {
    String fName;
    String lName;
    String id;
    // getters and setters
}

我有这些类的实例如下:

Student s1= new Student("Lisa", "xyz", "12");
Student s2= new Student("John", "klm", "13");
Student s3= new Student("Lisa", "xyz", "14");

Division d1= new Division();
Division d2= new Division();

Map<String, Student> studentMap1= new HashMap<>();
studentMap1.put("key1", s1);
studentMap1.put("key2", s2);

Map<String, Student> studentMap2= new HashMap<>();
studentMap2.put("key3", s3);


d1.setStudentMap(studentMap1);
d2.setStudentMap(studentMap2);

List<Division> dList= Arrays.asList(d1, d2);

在这里,请注意我们在 HashMap 中使用的键在 db 中是唯一的。 所以我可以在 Java 7 中写这样的东西来获取所有的 studentMap

  1. 获取所有学生的地图

    Map<String, Student> allstudentsMap= new HashMap<>();
    
    for(Division d: dList) {
    
        for(String key:d.getStudentMap().keySet()) {
            allstudentsMap.put(key, d.getStudentMap().get(key));
    
        }
    }
    
  2. 我还需要获取某些过滤条件的键列表。例如,获取姓名为 Lisa 的学生的密钥列表。我可以使用上面的 HashMap 得到一个列表,如下所示:

    List<String> filterList= new ArrayList<>();
    Student s;
    for(String key:allstudentsMap.keySet()) {
    
        s= allstudentsMap.get(key);
        if(s.getfName().equalsIgnoreCase("Lisa")) {
            filterList.add(key);
        }
    
    }
    

我需要帮助才能使用 Java 8 流来做同样的事情。 1. 获取所有学生地图 2. 获取某个过滤条件的所有键的列表。

【问题讨论】:

    标签: java lambda java-8 java-stream


    【解决方案1】:

    考虑到所有键都是唯一的,您可以简单地将多个映射中的每个条目放入最终映射中:

    Map<String, Student> allStudentsMap = new HashMap<>();
    dList.forEach(d -> d.getStudentMap().forEach(allStudentsMap::put));
    

    然后,在entrySet 上应用filter 并收集相应的密钥:

    List<String> filterList = allStudentsMap.entrySet().stream()
            .filter(e -> e.getValue().getfName().equalsIgnoreCase("Lisa"))
            .map(Map.Entry::getKey)
            .collect(Collectors.toList());
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-09-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-01
      • 1970-01-01
      相关资源
      最近更新 更多