嵌套for循环到Java 8 Stream API表示

Rai*_*nne 2 java java-8 java-stream

最近我决定通过重构简单的代码片段来研究Java 8.我有以下示例,我试图转换为Java 8表示.

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

我设法想出这样的东西:

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

但我不知道我可以留在哪里:

System.out.println(" ");
Run Code Online (Sandbox Code Playgroud)

我尝试过类似的东西:

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

但它给了我一个我不完全理解的错误."此表达式的目标类型必须是功能接口".

我相信这是一个非常简单的错误,但我今天才开始研究Java 8,所以任何帮助都会非常感激.

Tun*_*aki 5

这不会更优雅但你可以:

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

考虑到这些问题,最好保持一个好的for循环.

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

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