将嵌套循环更改为流

时间:2016-08-03 07:03:21

标签: loops lambda java-8 java-stream

这是我的代码。我想使用流和lambda将其更改为Java 8样式。你能帮帮我吗?

Annotation[][] annotations = joinPoint.getTarget().getClass()
            .getMethod(methodName, signature.getParameterTypes()).getParameterAnnotations();

    for (int i = 0; i < parametersCount; i++) {
        for (int j = 0; j < annotations[i].length; j++) {
            Annotation annnotation = annotations[i][j];
            if (annnotation.annotationType().isAssignableFrom(Hidden.class)) {
                args.set(i, "***************");
            }
        }
    }

2 个答案:

答案 0 :(得分:0)

我不知道您希望实现什么,但将代码转换为Stream API的方式如下:

IntStream.range(0, parametersCount).forEach(
    i -> Arrays.stream(annotations[i])
               .filter(a -> a.annotationType().isAssignableFrom(Hidden.class))
               .forEach(annotation -> args.set(i, "***********"))
);

答案 1 :(得分:0)

您可以采用以下方式撰写:

// create stream of indices
IntStream.range(0, parametersCount) 
         // filter it leaving only those which have at least one Hidden annotation
         .filter(i -> Stream.of(annotations[i])
              .anyMatch(a -> a.annotationType().isAssignableFrom(Hidden.class)))
         // reset the corresponding args
         .forEach(i -> args.set(i, "***********"));

请注意,由于以下原因,此问题不太适合Stream API:

  1. 您正在修改现有数据结构。当您对不可变数据结构进行操作(生成新内容而不是改变现有内容)时,Stream API是最有用的。

  2. 你有&#34; parallel&#34;结构:args的第一个元素对应annotations的第一个元素,第二个元素也是如此,依此类推。这通常不是很好的代码设计,并且标准的Stream API不是为了支持它而定制的。