SyncMasterは:
私は、Java 8つの流れを学んでいると私は、メソッドをリファクタリングしようとしています。
私は学校のクラスと持っていると言う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);
}
私はこの2つの関数を組み合わせることができます良いの方法はありますか?場合は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
}
あなたはどちらかだけ知られている学校で、またはすべての学校で検索する必要があります。アイデアは、検索処理の共通の特性に基づいています。どの学校での発見は、あなたが1つの知られている学校やすべてのものを反復にかかわらず同じまま。
また取得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
}