Tengo una lista de estudiantes y quiero traer solo la LeaderID en la parte superior de la misma lista después de que sigue siendo los elementos de la lista restante utilizando las transmisiones de Java. Probé la siguiente lógica, pero no funciona como se esperaba.

List<Student> students = ....

Long leaderId = 123;

students.stream().sort((s1,s2) -> leaderId.equals(s1.getId()) || leaderId.equals(s2.getId()) ? 1: 0).collect(Collectors.toList());

¿Alguien puede darme alguna sugerencia sobre esto?

Ejemplo

Lista de estudiantes:

[{id:121, name:"John"}, {id:131, name:"Susan"}, {id:123, name:"Jacob"}, {id:155, name:"Sunny"}]

Salida esperada

[{id:123, name:"Jacob"}, {id:121, name:"John"}, {id:131, name:"Susan"}, {id:155, name:"Sunny"}]
1
Alex Man 8 jun. 2021 a las 16:44

2 respuestas

La mejor respuesta

Tienes que escribir tu propio comparador primero, lo que coloca al líder en la parte delantera de la lista cuando se ordenó usarlo. Entonces tienes que usarlo para ordenar la lista. No veo ningún punto de usar los arroyos aquí, ya que el código iterativo se ve más simple y legible. Así es como se ve en la práctica.

static class LeaderFirstComparator implements Comparator<Student> {
    final long leaderId;

    LeaderFirstComparator(long leaderId) {
        this.leaderId = leaderId;
    }

    @Override
    public int compare(Student o1, Student o2) {
        if (o1.id == leaderId && o2.id != leaderId)
            return -1;
        else if (o1.id != leaderId && o2.id == leaderId)
            return 1;
        else
            return 0;
    }

}

Y el código del cliente:

students.sort(new LeaderFirstComparator(leaderId));

Actualizar

Si el primer objeto es el líder, entonces debería venir antes del segundo, por lo tanto, regresar -1 de acuerdo con el contrato. De lo contrario, si el segundo objeto es el líder, entonces el primero debe venir después de ella, por lo tanto 1. Si se conservan menos de los objetos, y ambos son líderes, entonces se conserva el pedido original. Así volviendo 0.

1
Ravindra Ranwala 8 jun. 2021 a las 17:01

Si el líder tiene una identificación concreta equivale a 123, puede obtenerlo solo con un filtro

List leaderStudents = students.stream().filter(s1 -> leaderId.equals(s1.getId()).collect(Collectors.toList());
0
JArgente 8 jun. 2021 a las 13:51