optimization - 获取一组行的最优化方法是什么,这些行出现在 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 中处理上述问题的最佳方法是什么?
解决方案
这在 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(....)
和有后向端口dropWhile
,takeWhile
请参见此处和此处
编辑
或者,您可以先获取这些分隔符的索引,然后再执行 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);
推荐阅读
- java - JDK 8u202 中的 java.lang.AssertionError
- javascript - Jquery 数字类别选择器的 categoryNames 的最小值和最大值不同
- arrays - 如何使用 if 语句转发数组值返回 false?
- c# - Angular 7 和 ASP.NET MVC 集成 - 样式
- c - 一种改变 GTK+ 主题路径的方法?
- kubernetes-helm - 错误:requirements.lock 与 requirements.yaml 不同步
- python - 使用 Glob 将文件夹内具有部分名称的文件名获取到列表中
- r - 使用 RDCOMClient 搜索 Outlook 收件箱
- groovy - Jenkins returns null instead of error in output
- reactjs - React Webpack:TypeError:react__WEBPACK_IMPORTED_MODULE_7___default.a.createContext