只是想通过 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)
一起使用。以下示例使用 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 集合 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 的 FizzBuzz,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37814655/