使用 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