嵌套用于Java 8 Stream API表示的循环



最近我决定通过重构简单的代码来研究Java8。我有下面的例子,我正试图将其转换为Java8表示。

public static void halfTriangle(){
        for(int i=1; i<=4; i++){
            for(int j=1; j<=i; j++){
                System.out.print("* ");
            }
            System.out.println(" ");
        }
    }

我设法想出了这样的东西:

public static void halfTriangleJava8(){
        IntStream.range(1, 5)
            .forEach(i -> IntStream.range(1, 5)
                .forEach(j -> System.out.println("* "))
        );
    }

但我不知道我能把剩下的东西放在哪里:

System.out.println(" ");

我试过这样的东西:

public static void halfTriangleJava8(){
        IntStream.range(1, 5)
            .forEach(i -> {
                IntStream.range(1, 5);
                System.out.println(" ");
            }
                .forEach(j -> System.out.println("* "))
        );
    }

但它给了我一个错误,我并不完全理解。"此表达式的目标类型必须是函数接口"。

我相信这是一个非常简单的错误,但我今天才开始研究Java8,所以任何帮助都将不胜感激。

这不会更优雅,但你可以拥有:

public static void halfTriangleJava8(){
    IntStream.range(1, 5).forEach(i -> {
        IntStream.rangeClosed(1, i).forEach(j -> System.out.print("* "));
        System.out.println(" ");
    });
}

考虑到这些问题,最好保留一个好的旧for循环。

一种更漂亮的方法是将每个整数映射到String中,以便在相应的行打印:

public static void halfTriangleJava8(){
    IntStream.range(1, 5)
             .mapToObj(i -> String.join(" ", Collections.nCopies(i, "*")))
             .forEach(System.out::println);
}

您可以添加{}大括号;并且可以使用IntStream.rangeClosed(int, int),这样就可以保持相同的索引。类似

IntStream.rangeClosed(1, 4).forEach(i -> {
    IntStream.rangeClosed(1, i).forEach(j -> System.out.print("* "));
    System.out.println();
});

最新更新