繁体   English   中英

在Java8中的嵌套Map中搜索值

[英]Searching a value in a nested Map in Java8

我正在尝试使用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")));

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

我强烈建议您创建一个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()
                                        .anyMatch(e -> e.getName().equals("Andy"));

这将需要一个Stream的值classStudentGrp (在Map<String, Student ),采取的数值Map (A Stream<Students> ),然后使用anyMatch ,以确定是否有任何的Students有名为“安迪”

您可以使用以下方法进行测试:

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

但是您应该使用如下的Student对象:

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

使用List<Student>您可以使用以下命令:

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

参考下面的例子

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/

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM