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