Java listas de filtro e encontrar primeira / última encontrar

A-Proton-Resurgence:

Eu tenho uma lista java de objetos. Os atributos de objeto são:

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

Agora, eu quero encontrar o filtro da lista com base em tag e obter primeiro / último elemento.

Por exemplo: os valores dos tags possíveis: A, B, C. Para tags com valor A - Eu quero o último elemento, e B - Quero primeiro elemento, C - primeiro elemento

Solução atual:

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

No entanto, eu entendo isso é uma solução ineficiente uma vez que estamos looping três vezes. alguém ajuda pode me resolvê-lo de uma forma mais performance?

Qualquer ajuda será apreciada, obrigado :)

Lino:

Sugiro agrupar o checkPointListpor tag em um 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);
}

A lista ligada é um auxiliar útil porque permite obter directamente o primeiro ou o último elemento (e se os retornos ausentes null):

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

Ou você pode simplesmente usar isso ainda mais 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;
    }
}

As variáveis para "B"e "C"são sempre substituídos com o último valor, enquanto para aapenas o primeiro "A"ponto de verificação será escolhido.

Acho que você gosta

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