In java, but in functional paradigm (don’t do this at work).
public static void main(String[] args) {
final String result = IntStream
.rangeClosed(1, 100)
.mapToObj(Scratch::fizzBuzz)
.collect(Collectors.joining(", "));
System.out.print(result);
}
static String fizzBuzz(int n) {
return buzz(n)
.andThen(fizz(n))
.apply(Function.identity())
.apply(String.valueOf(n));
}
static Function<Function<String, String>, Function<String, String>> buzz(int n) {
return test(n, 5, "buzz");
}
static Function<Function<String, String>, Function<String, String>> fizz(int n) {
return test(n, 3, "fizz");
}
static Function<Function<String, String>, Function<String, String>> test(int number, int divisor, String match) {
return f -> d -> test(number, divisor, match, f, d);
}
static String test(int number, int divisor, String match, Function<String, String> next, String defaultValue) {
return number % divisor == 0
? match + next.apply("")
: next.apply(defaultValue);
}