我正在尝试使用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中做到这一点。
答案 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()))