使用IntStream迭代和调用方法



如何在使用IntStream迭代范围的同时调用函数来打印值?

public static void fizzBuzz(int n) {
// The below does not work as it expects a return value.
// Is there a different method that I could use to perform this?
IntStream.range(1, n).map(n -> print(n));
}
private static void print(int n){
boolean isDivisibleBy3 = n % 3 == 0;
boolean isDivisibleBy5 = n % 5 == 0;

if(isDivisibleBy3 && isDivisibleBy5){
System.out.println("FizzBuzz");
} else if (isDivisibleBy3){
System.out.println("Fizz");
} else if (isDivisibleBy5){
System.out.println("Buzz");
} else {
System.out.println(n);
}
}

也许这就是您想要的。让方法返回字符串。然后使用IntStream迭代数字。然后将它们传递给方法,该方法将int映射到作为String的返回值。然后您只需打印该值。

public class FizzBuzzStream {

public static void main(String[] args) {

int n = 20;

IntStream.range(1, n).mapToObj(FizzBuzzStream::eval)
.forEach(System.out::println); 

}

private static String eval(int n) {
boolean isDivisibleBy3 = n % 3 == 0;
boolean isDivisibleBy5 = n % 5 == 0;

if (isDivisibleBy3 && isDivisibleBy5) {
return "FizzBuzz";
}
if (isDivisibleBy3) {
return "Fizz";
}
if (isDivisibleBy5) {
return "Buzz";
}
return Integer.toString(n);
}

}

打印

1
2
Fizz
4
Buzz
Fizz
7
8
Fizz
Buzz
11
Fizz
13
14
FizzBuzz
16
17
Fizz
19

map用于将一个值转换为另一个值。由于print不返回任何内容(其返回类型为void(,因此不能使用map。不过,您可以使用forEach

IntStream.range(1, n).forEach(n -> print(n));

map()操作需要一个非void函数作为其输入,这样该函数就可以应用于流中的每个元素并替换它们。请改用forEach()。它可以在元素上应用void函数。

也不要在lambda表达式中使用n。它已声明,无法覆盖。

public static void fizzBuzz(int n) {
IntStream.range(1, n).forEach(x -> print(x));
}

正如其他人所指出的,您当前的方法不适用于map,因为您的函数是void。您可以将int映射到String。这种方法可能看起来像

private static String mapFizzBuzz(int n) {
boolean isDivisibleBy3 = n % 3 == 0;
boolean isDivisibleBy5 = n % 5 == 0;
if (isDivisibleBy3 && isDivisibleBy5) {
return "FizzBuzz";
} else if (isDivisibleBy3) {
return "Fizz";
} else if (isDivisibleBy5) {
return "Buzz";
}
return Integer.toString(n);
}

然后,如果你进一步打印forEach,你目前的方法就会奏效。比如

IntStream.range(1, n).mapToObj(x -> mapFizzBuzz(x)).forEach(System.out::println);

最新更新