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 :)
Sugiro agrupar o checkPointList
por 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 a
apenas o primeiro "A"
ponto de verificação será escolhido.