在 java 8 中获取列表中间存在的一组行的最优化方法是什么?



我有一个项目列表。我想处理列表中间的一组项目。 例如:假设一个以 ID、名字、姓氏和中间名作为属性的员工列表。 我想考虑姓氏"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 中处理上述问题的最佳方法是什么?

这在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的后端端口,请参阅此处和此处

编辑

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

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

最新更新