首页 > 解决方案 > 用 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] 中获取正确的值。

谢谢

标签: java

解决方案


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);
}

推荐阅读