Java listas de filtro y encontrar primero / encontrar la última

El protón-Resurgimiento:

Tengo una lista de objetos de Java. Los atributos de los objetos son:

public class CheckPoint {
    private String message;
    private String tag;
}

Ahora, quiero encontrar el filtro de la lista basándose en la etiqueta y obtener primero / último elemento.

Para, por ejemplo: valores de variables posibles: A, B, C. Para las etiquetas de valor A - Quiero el último elemento, y B - Quiero primer elemento, C - primer elemento

Solución actual:

CheckPoint inTransitCheckPoint = checkPointsList.stream().filter(c -> c.getTag().equals("A")).reduce((first, second) -> second).orElse(null);

CheckPoint useCheckPoint = checkPointsList.stream().filter(c -> c.getTag().equals("B")).findFirst.orElse(null);

CheckPoint typeCheckPoint = checkPointsList.stream().filter(c -> c.getTag().equals("C")).findFirst.orElse(null);

Sin embargo, yo entiendo que esta es una solución ineficiente ya que se recorre tres veces. ¿Puede alguien ayudarme a resolverlo de una manera más performante?

Cualquier ayuda será apreciada, gracias :)

Lino:

Sugiero que agrupa al checkPointListpor etiqueta en una Map<String, LinkedList<CheckPoint>>:

Map<String, LinkedList<CheckPoint>> map = new HashMap<>();
map.put("A", new LinkedList<>());
map.put("B", new LinkedList<>());
map.put("C", new LinkedList<>());

for(CheckPoint c : checkPointList) {
    map.computeIfAbsent(c.getTag(), ignored -> new LinkedList<>()).add(c);
}

La lista enlazada es una ayuda muy útil ya que le permite obtener directamente el primer o el último elemento (y si vuelve ausentes null):

CheckPoint A = map.get("A").pollLast();
CheckPoint B = map.get("B").pollFirst();
CheckPoint C = map.get("C").pollFirst();

O simplemente puede utilizar este aún más fácil for-loop:

CheckPoint a = null, b = null, c = null;
for (CheckPoint checkPoint : checkPointList) {
    String tag = checkPoint.getTag();
    if ("A".equals(tag) && a == null) {
        a = checkPoint;
    } else if("B".equals(tag)){
        b = checkPoint;
    } else if("C".equals(tag)){
        c = checkPoint;
    }
}

Las variables para "B"y "C"siempre se sobreescriben con el último valor, mientras que para asólo la primera "A"será elegido puesto de control.

Supongo que te gusta

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