java - 用 Java 流替换嵌套循环
问题描述
如何用 Streams 替换以下代码?
Annotation[][] annotations = context.getMethod().getParameterAnnotations();
Object[] parameterValues = context.getParameters();
StringBuilder stringBuilder = new StringBuilder();
for (int i = 0; i < annotations.length; i++) {
for (int j = 0; j < annotations[i].length; j++) {
if (annotations[i][j] instanceof CacheKey && parameterValues[i] != null) {
stringBuilder.append(parameterValues[i]);
break;
}
}
}
我可以轻松地使用 flatmap 从数组的第一个数组中获取数据,但我不知道如何获取位置以从 parameterValues[i] 中获取正确的值。
谢谢
解决方案
annotations
你可以使用一些已知的方法paremeterValues
进行压缩,但你也应该问自己“这会比它已经更易读和更好吗?”。简短的回答 - 不。
当您实际上可以将其提取到更高级别时,您在内部循环中进行比较parameterValues[i] != null
(这甚至需要吗?默认情况下参数不是不为空吗?)。您还可以用 for-each 替换内部循环,甚至更好地重构为 simple matchAny()
on stream 或(最好的) use getAnnotation()
。还要检查您是否可以直接从 Parameter 获取注释,以便归结为一个简单的:
StringBuilder sb = new StringBuilder();
for (var param : context.getParameters()) {
if (param != null // is it needed ?
&& param.getAnnotation(CacheKey::class) != null)
sb.append(param);
}
推荐阅读
- c# - 什么是正确的语法 year(date_column) = year(getdate())?
- hive - Hive 表无法识别分区
- sdl - 在 SDL2 中,SDL_JoystickInstanceID 何时不同于 SDL_JoystickOpen(n)?
- python - 如何从列表中删除“子列表”?
- c# - Selenium - 如何验证点击时未提交的表单?(客户验证工作)
- github - 如何使用 GitHubs 的 GraphQL API v4 更新 Milestone 的描述?
- assembly - 为什么要为其他逻辑处理器导致的 Memory Order Violation 刷新管道?
- jquery - 引导模式对话框未打开
- c# - Visual Studio 的语言设置妥协了 Double in Binding 的标准格式
- c# - CsvSerializer.SerializeToCsv 返回空字符串序列化自定义对象的通用列表