首页 > 解决方案 > Java 列表过滤和查找第一个/查找最后一个

问题描述

我有一个 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);

但是,我确实理解这是一个低效的解决方案,因为我们循环了三次。有人可以帮助我以更高效的方式解决它吗?

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

标签: javaperformanceoptimizationcollectionsjava-8

解决方案


您可以先收集到Map例如:

Map<String, List<CheckPoint>> map = 
       checkPointsList.stream()
                      .collect(Collectors.groupingBy(CheckPoint::getTag));

Optional.ofNullable(map.get("A"))
        .orElse(Collection.emptyList())
        .reduce((left, right) -> right)
        .orElse(null);
// same for "B" and "C"

推荐阅读