只想通过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 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发行版开始,现在支持原始大小写函数。上面的代码现在可以编写如下,删除对的调用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的提交者。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句