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

Optimization 获取java 8列表中的一组行的最优化方法是什么?,optimization,java-8,java-stream,Optimization,Java 8,Java Stream,我有一张物品清单。我想处理一组在列表中间的项目。 例如:假设有一个以id、名字、姓氏和中间名为属性的员工列表。 我想考虑姓氏“xxx”和“yyy”之间的所有行,并进一步处理它们。 如何在Java8中对此进行优化?优化是我首先关心的问题。 尝试使用Java8流和并行流。但是Java8流中的foreach循环中不允许终止(break)。此外,我们不能在foreach内部使用外部(“下面的start”变量)变量。 下面是我需要优化的代码: boolean start = false; for(Empl

我有一张物品清单。我想处理一组在列表中间的项目。 例如:假设有一个以id、名字、姓氏和中间名为属性的员工列表。 我想考虑姓氏“xxx”和“yyy”之间的所有行,并进一步处理它们。 如何在Java8中对此进行优化?优化是我首先关心的问题。 尝试使用Java8流和并行流。但是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中处理上述问题的最佳方法是什么?

在java-9中可能通过(我简化了您的示例):

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

或者举个例子:

Stream.of(1, 2, 3, 4, 5, 6)
            .dropWhile(x -> x != 2)
            .takeWhile(x -> x != 6)
            .skip(1)
            .forEach(System.out::println);
employees.stream()
         .dropWhile(e -> e.getLastname().equals("xxx"))
         .takeWhile(e -> e.getLastname().equals("yyy"))
         .skip(1)
         .forEach(....)
dropWhile
takeWhile
的后台端口,请参阅和

编辑

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


您的意思是说在Java8中不可能对上述代码进行优化吗?无论我编写的原语代码是什么,这里都是唯一的解决方案,因为我根本无法使用Java9。@User1230321请参见编辑,java-8中有这些原语的后端口只有在
“yyy”
姓氏唯一的情况下,您的第二个变体才有效。@Holger同意。。。或者
xxx
也是唯一的。我将把它添加到回答中。因此,为了重现OP的代码行为,可以使用
int size=employees.size(),start=IntStream.range(0,size.).filter(x->employees.get(x).getLastname().equals(“xxx”).findFirst().orElse(size-1)+1,end=IntStream.range(start,size).filter(x->employees.get(x).getLastname().equals(“yy”)).findFirst().orElse(大小)
,后跟
employees.subList(开始、结束).forEach(System.out::println)
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);