lambda - 使用 JDK8 Lambda 的 FizzBu​​zz

标签 lambda java-8 fizzbuzz

只是想通过 JDK8 lambda 看看程序能有多小,我的方法是使用结果生成器:

IntStream.rangeClosed(0 , 100).forEach(i ->{
        StringBuffer bfr= new StringBuffer();
        if(i % 3 == 0 )
            bfr.append("Fizz");
        if(i % 5 == 0 )
            bfr.append("Buzz");
        if(i % 3 != 0 && i % 5 != 0 )
            bfr.append(i);

        System.out.println(bfr.toString());
});

任何人都可以尝试使用谓词来代替吗?我想不出有什么办法可以做到这一点。

最佳答案

以下是三种解决方案。

带有流的 Java 8:

IntStream.rangeClosed(0, 100).mapToObj(
        i -> i % 3 == 0 ?
                (i % 5 == 0 ? "FizzBuzz" : "Fizz") :
                (i % 5 == 0 ? "Buzz" : i))
        .forEach(System.out::println);

Java 8 与 Eclipse Collections :

IntInterval.zeroTo(100).collect(
        i -> i % 3 == 0 ?
                (i % 5 == 0 ? "FizzBuzz" : "Fizz") :
                (i % 5 == 0 ? "Buzz" : i))
        .each(System.out::println);

Java 8 与使用谓词的 Eclipse 集合:

Interval.zeroTo(100).collect(
        new CaseFunction<Integer, String>(Object::toString)
            .addCase(i -> i % 15 == 0, e -> "FizzBuzz")
            .addCase(i -> i % 3 == 0, e -> "Fizz")
            .addCase(i -> i % 5 == 0, e -> "Buzz"))
        .each(System.out::println);

更新:

作为 Eclipse 集合 8.0 release ,Eclipse Collections 中的函数接口(interface)现在扩展了 Java 8 中的等效函数接口(interface)。这意味着 CaseFunction现在可以用作java.util.function.Function ,这意味着它将与 Stream.map(Function) 一起使用。以下示例使用 CaseFunctionStream<Integer> :

IntStream.rangeClosed(0, 100).boxed().map(
        new CaseFunction<Integer, String>(Object::toString)
                .addCase(i -> i % 15 == 0, e -> "FizzBuzz")
                .addCase(i -> i % 3 == 0, e -> "Fizz")
                .addCase(i -> i % 5 == 0, e -> "Buzz"))
        .forEach(System.out::println);

更新:

作为 Eclipse 集合 8.1 release ,现在支持原始 case 函数。上面的代码现在可以编写如下,删除对 boxed 的调用。 IntCaseFunction实现IntToObjectFunction延伸java.util.function.IntFunction .

IntStream.rangeClosed(0, 100).mapToObj(
        new IntCaseFunction<>(Integer::toString)
                .addCase(i -> i % 15 == 0, e -> "FizzBuzz")
                .addCase(i -> i % 3 == 0, e -> "Fizz")
                .addCase(i -> i % 5 == 0, e -> "Buzz"))
        .forEach(System.out::println);

IntCaseFunction也将与 IntInterval 一起使用例如,作为参数传递给 collect方法。

注意:我是 Eclipse Collections 的提交者.

关于lambda - 使用 JDK8 Lambda 的 FizzBu​​zz,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37814655/

相关文章:

java - 扁平化列表列表的 3 种方法。有理由更喜欢其中之一吗?

CodeEval 提交,程序在我的电脑上运行,但在我提交时却不行。 C

c# - Lambda 事件处理程序范围

c++ - 未在 lambda 内部调用显式运算符 bool — MSVC 错误?

java - 映射嵌套可选?

r - 为什么我在 R 中的 "Fizz Buzz"测试不起作用?

php - 另一个 FizzBu​​zz 解决方案

c# - 创建、组合和缓存 lambda 表达式

java - Eclipse 条件断点不起作用

Java 8 可选时间部分不起作用