gpt4 book ai didi

java - 如何使用可选参数从 HashMap 中检索值

转载 作者:搜寻专家 更新时间:2023-11-01 01:59:53 24 4
gpt4 key购买 nike

我正在学习 Java 8 流,我正在尝试重构一种方法。

假设我有一个 School 类和一个 school map,它按 Id 存储所有学校对象。每个学校对象都包含一个 student map,用于存储一群学生。

在这种情况下,学生 ID 在所有学校中都是唯一的。

我有一个函数可以通过所有学校的 id 检索学生。

public Student getStudent(Map<String, School> schoolMap, String studentId) {
return schoolMap.values().stream()
.map(School::getStudentIdToStudentMap)
.filter(map -> map.containsKey(studentId))
.map(map -> map.get(studentId))
.findAny().get();
}

现在,我想更改函数以使用 schoolId 作为过滤器(如果可用)。

public Student getStudent(Map<String, School> schoolMap, 
String schoolId /* can be null */,
String studentId)
{
// TODO: Something that I have tried
return schoolMap.get(schoolId)
.getStudentIdToStudentMap()
.get(studentId);
}

有什么好的方法可以将这两个功能结合起来吗?如果 schoolId 为 null,则从所有学校获取学生。否则只需查找特定学校并检索学生?

最佳答案

我打赌这就是您要找的:

public Student getStudent(Map<String, School> schoolMap, String schoolId, String studentId)
{
return Optional.ofNullable(schoolId) // schoolId might be null
.map(id -> Stream.of(schoolMap.get(id))) // get Stream<School> by else
.orElse(schoolMap.values().stream()) // ... get Stream of all Schools
.flatMap(i -> i.getStudentIdToStudentMap() // students from 1/all schools ...
.entrySet().stream()) // flat map to Stream<Entry<..,..>>
.collect(Collectors.toMap( // collect all entries bu key/value
Entry::getKey, Entry::getValue)) // ... Map<String,Student>
.getOrDefault(studentId, null); // get Student by id or else null
}

您必须在唯一已知的学校或所有学校中进行搜索。这个想法是基于搜索过程的共同特征。无论您迭代一所已知学校还是所有学校,任何学校的发现都保持不变。

或者获取 List<Student>来自 Optional ,

public Student getStudent(Map<String, School> schoolMap, String schoolId, String studentId)
{
return Optional.ofNullable(schoolId) // schoolId might be null
.map(i -> Collections.singletonList(schoolMap.get(i))) // add School into List
.orElse(new ArrayList<>(schoolMap.values())) // ... else all schools
.stream()
.map(i -> i.getStudentIdToStudentMap() // get Map of students from 1/all
.get(studentId)) // ... find by studentId
.filter(Objects::nonNull) // get rid of nulls
.findFirst().orElse(null); // get Student by id or else null
}

关于java - 如何使用可选参数从 HashMap 中检索值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52010300/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com