最近我决定通过重构简单的代码来研究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();
});