我有一个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);
但是,由于我们循环了三次,因此我确实知道这是一种无效的解决方案。有人可以帮我解决问题吗?
任何帮助将不胜感激,谢谢:)
答案 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"
检查点。