在Java8中的嵌套Map中搜索值

时间:2019-05-31 15:29:15

标签: java java-8 nested maps

我正在尝试使用java8在嵌套映射中查找特定值。 例: 该地图是

Map<Integer, Map<String,String>> classStudentGrp;

和某些记录类似

StudentId1:
StudentName:Andy
StudentAge:12
StudentAddress:xxxx

StudentId1:
StudentName:Anna
StudentAge:11
StudentAddress:yyyy

以此类推。

我正在看

classStudentGrp.forEach((sid,stu)->stu.forEach((sAttr,val)->val.equals("Andy")));

,如果要找到'Andy',我想返回一个布尔值(true)或设置一个变量。我知道使用输入键和值的传统方法,但是尝试在lambda中做到这一点。

3 个答案:

答案 0 :(得分:2)

我强烈建议您创建一个Student类,而不只是使用以下格式的String

StudentId1:
StudentName:Andy
StudentAge:12
StudentAddress:xxxx

Java是一种面向对象的语言,最好按原样使用它。您可以创建一个像这样的类:

class Student {
   private String name;
   private String id;
   private int age;
   private String address;  
   //Getters and setters
   //Appropriate constructors
}

那么你可以做:

boolean value = classStudentGrp.values().stream()
                                        .flatMap(e -> e.values().stream())
                                        .anyMatch(e -> e.getName().equals("Andy"));

哪个将获取Stream的值{{1}中的classStudentGrp,取那个Map<String, Student的值(A Map),然后使用Stream<Students>来确定anyMatch中是否有一个名称为“ Andy”

答案 1 :(得分:0)

请参阅下面的示例

List<String> result = lines.stream()                // convert list to stream
  .filter(line -> "mkyong".equals(line))            // we dont like mkyong
  .collect(Collectors.toList()); 

来自https://www.mkyong.com/java8/java-8-streams-filter-examples/

答案 2 :(得分:0)

您可以对此进行测试:

boolean contains = classStudentGrp.values().stream()
        .anyMatch(m -> m.values().stream().anyMatch("Andy"::equals));

但是您应该使用Student对象:

public class Student {
    private String name;
    private int age;
    // ...
}

通过List<Student>,您可以使用以下方法:

boolean contains = classStudentGrp.stream().anyMatch(s -> "Andy".equals(s.getName()))
相关问题