首页 > 解决方案 > 获取一组行的最优化方法是什么,这些行出现在 java 8 的列表中间?

问题描述

我有一个项目清单。我想处理一组位于列表中间的项目。例如:假设具有 id、名字、姓氏和中间名作为属性的员工列表。我想考虑 lastName "xxx" 和 "yyy" 之间的所有行并进一步处理它们。如何在 Java8 中对此进行优化?优化是我最关心的问题。尝试使用 Java8 流和并行流。但是在 Java8 流的 foreach 循环中不允许终止(中断)。我们也不能在 foreach 中使用外部(下面的“start”变量)变量。下面是我需要优化的代码:

boolean start = false;
for(Employee employee: employees) {
    if(employee.getLastname().equals("yyy")) {
        break;
    } 
    if(start) {
    // My code to process
    }
    if(employee.getLastname().equals("xxx")) {
        start = true;
    }
}

在 Java8 中处理上述问题的最佳方法是什么?

标签: optimizationjava-8java-stream

解决方案


这在 java-9 中是可能的(我已经简化了你的例子):

Stream.of(1, 2, 3, 4, 5, 6)
            .dropWhile(x -> x != 2)
            .takeWhile(x -> x != 6)
            .skip(1)
            .forEach(System.out::println);

这将获得范围内的值2 - 6,即打印3,4,5

或者对于您的示例:

employees.stream()
         .dropWhile(e -> e.getLastname().equals("xxx"))
         .takeWhile(e -> e.getLastname().equals("yyy"))
         .skip(1)
         .forEach(....)

和有后向端口dropWhiletakeWhile请参见此处此处

编辑

或者,您可以先获取这些分隔符的索引,然后再执行 a subList(但这假设xxx并且yyy在员工列表中是唯一的):

int[] indexes = IntStream.range(0, employees.size())
            .filter(x -> list.get(x).getLastname().equals("xxx") || list.get(x).getLastname().equals("yyy"))
            .toArray();

employees.subList(indexes[0] + 1, indexes[1])
            .forEach(System.out::println);

推荐阅读