使用 IntStream 迭代调用方法
Using IntStream to iterate and call a method
如何在使用 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);
}
}
map()
操作需要一个非空函数作为其输入,以便该函数可以应用于流中的每个元素并替换它们。
请改用 forEach()
。它可以在您的元素上应用 void 函数。
也不要在 lambda 表达式中使用 n
。它已经被声明并且不能被覆盖。
public static void fizzBuzz(int n) {
IntStream.range(1, n).forEach(x -> print(x));
}
map
用于将一个值转换为另一个值。因为 print
没有 return 任何东西(它的 return 类型是 void
),你不能使用 map
。不过,您可以使用 forEach
代替:
IntStream.range(1, n).forEach(n -> print(n));
正如其他人指出的那样,您当前的方法不适合 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);
也许这就是您想要的。有方法 return 字符串。然后使用 IntStream
遍历数字。然后将这些传递给方法,该方法将 int
映射到 returned 值,即 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
如何在使用 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);
}
}
map()
操作需要一个非空函数作为其输入,以便该函数可以应用于流中的每个元素并替换它们。
请改用 forEach()
。它可以在您的元素上应用 void 函数。
也不要在 lambda 表达式中使用 n
。它已经被声明并且不能被覆盖。
public static void fizzBuzz(int n) {
IntStream.range(1, n).forEach(x -> print(x));
}
map
用于将一个值转换为另一个值。因为 print
没有 return 任何东西(它的 return 类型是 void
),你不能使用 map
。不过,您可以使用 forEach
代替:
IntStream.range(1, n).forEach(n -> print(n));
正如其他人指出的那样,您当前的方法不适合 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);
也许这就是您想要的。有方法 return 字符串。然后使用 IntStream
遍历数字。然后将这些传递给方法,该方法将 int
映射到 returned 值,即 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