我有一份物品清单。我想要处理列表中间的一组项目。例如:假设员工列表的属性为id、名字、姓氏和中间名。我希望考虑lastName "xxx“和"yyy”之间的所有行,并进一步处理它们。如何在Java8中对此进行优化?优化是我首先关注的问题。已尝试使用Java8 streams和并行流。但是在Java8流中的foreach循环中不允许终止(Break)。此外,我们不能在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中处理上述问题的最佳方法是什么?
发布于 2018-09-24 17:27:40
这在java-9 via中是可能的(我简化了您的示例):
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(....)有用于dropWhile和takeWhile的后端口,请参阅here和here
编辑
或者,您可以先获取这些分隔符的索引,然后再获取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);https://stackoverflow.com/questions/52476141
复制相似问题