使用JDK8 Lambda的FizzBuzz

Seng Zhe

只想通过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());
});

任何人都可以尝试使用谓词吗?我想不出办法。

唐纳德·拉布(Donald Raab)

这是三个解决方案。

Java 8 with Streams:

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

具有Eclipse集合的Java 8

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

使用谓词的带有Eclipse集合的Java 8:

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 Collections 8.0版本开始Eclipse Collections中的功能接口现在扩展了Java 8中的等效功能接口。这意味着它CaseFunction现在可以用作java.util.function.Function,这意味着它可以与一起使用Stream.map(Function)以下示例CaseFunction与结合使用Stream<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 Collections 8.1发行版开始,现在支持原始大小写函数。上面的代码现在可以编写如下,删除对的调用boxedIntCaseFunction器具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的提交者

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章