Java列表过滤器并首先查找/查找最后

时间:2019-03-21 15:34:00

标签: java performance optimization collections java-8

我有一个Java对象列表。对象属性是:

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

现在,我想基于标签找到列表过滤器并获取第一个/最后一个元素。

例如:可能的标签值:A,B,C。对于具有 A 值的标签-我想要最后一个元素,而 B 的标签我想要第一个元素, C -第一个元素

当前解决方案:

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

但是,由于我们循环了三次,因此我确实知道这是一种无效的解决方案。有人可以帮我解决问题吗?

任何帮助将不胜感激,谢谢:)

2 个答案:

答案 0 :(得分:2)

例如,您可以先收集到Jenkinsfile

Map

答案 1 :(得分:2)

我建议按标签将checkPointList分组为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);
}

链接列表是一个方便的帮手,因为它使您可以直接获取第一个或最后一个元素(如果缺少则返回null):

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

或者您可以更简单地使用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;
    }
}

"B""C"的变量始终被最后一个值覆盖,而对于a,则仅选择第一个"A"检查点。