Cómo recuperar un valor de HashMap con argumento opcional

SyncMaster:

Estoy aprendiendo Java 8 arroyos y yo estoy tratando de refactorizar un método.

Decir que tengo una clase de Escuela y una school mapque almacena todos los objetos de la escuela por ID. Cada objeto contiene una escuela student mapque almacena un grupo de estudiantes.

En este escenario, las identificaciones de estudiante son únicos a través de las escuelas.

Tengo una función que recupera un estudiante por la ID en todas las escuelas.

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();
}

Ahora, quiero cambiar la función a su uso schoolIdcomo filtro si está disponible.

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);
}

¿Hay una manera bien que puedo combinar estas dos funciones? Si schoolIdes nulo, obtener el estudiante de todas las escuelas. Los demás sólo las operaciones de búsqueda en la escuela en particular y recuperar el estudiante?

Nikolas:

Apuesto a que esto es lo que está buscando:

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
}

Usted tiene que buscar, ya sea en la escuela o sólo se conoce en todas las escuelas. La idea se basa en las características comunes del proceso de búsqueda. El hallazgo en cualquier escuela sigue siendo el mismo, independientemente iterar una escuela conocida o todas las unidades.

Alternativamente obtener List<Student>a partir 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
}

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=186370&siteId=1
Recomendado
Clasificación