Java Streams 8个很酷的特性

Lambda表达式是目前Java8最酷的特性之一。但我认为还有一项秘密武器类似于“语法糖”在提升代码可读性和可塑性很强大。当你使得代码更富有表现力时,它可以使你的任务中最困难的部分简单化,且能够表现更深的含义。

那个秘密武器?就是Java Streams API。近期我参加了一个需要在高性能要求环境中使用Streams的在线会议。我惊喜地发现那些API使得代码中的主要流程更清晰,并且可以应对我需要做出的改变。

1.不需要lambda表达式的Stream

尽管这个API确实跟Lambda搭配得很好,但你可以不使用它。你可以一直使用匿名类,但何必呢?更多的场景我们使用一个方法引用(类似Integer::valueOf),或者一个实例对象。使用方法引用可以使一些复杂的多行逻辑从主流程中抽出,就如你在优化一个hashset查找一样。实例对象允许你实现GOF的策略模式。但除非你真的没办法,否则请不要再用匿名类了。

2.深入Stream去调试

在操作流的过程中也许你会想添加一个中介者,这时你可以添加一个叫peek的东西。这个操作接收一个消费者(consumer),不返回任何数据,实际上就是一个返回void的最基础的lambda。我最喜欢使用peek的方式是发送调试信息给系统,如:

.peek(System.out::println)
.peek(it -> System.out.printf("it is %s%n", it)

3.任何东西都可以被Stream

Stream在使用集合、数组或者其他东西没有被限制,甚至固定东西的列表。如果你可以通过创建迭代器(Iterator)或Supplier lambda来创建流的数据,那么你可以通过java.util.stream.StreamSupport类的方法创建流。可以想像一下一个由如内存消耗或网络吞吐量常量驱动Stream。

4.任意数字都可以被流化

如果你正在寻找老式的例如从java.util.Random生成随机数的方式,现在已经有三套新的方法来流化ints(),longs()和doubles()。那些方法的重载的版本可以让你设置边界(bounds),种子数(seed),和需要Stream的随机数总量

5.Streaming 读取器

另外一个JAVA开发人员的通用任务就是行到行的处理文件。现在我们可以通过java.io.BufferedReader的lines方法,它可以让I/O流转换为适合流操作的字符串流。

6.Stream文件树

如果你不想处理文件内容,那么文件树呢?java.nio.file.Files提供了一些返回Streams的方法。list()会列出文件夹内的所有文件,walk()会递归文件夹,而filter()会根据属性过滤器进行递归处理(当你只拥有一个Path对象时,有时它会令人费解)

7.Stream富文本

如果你还专注于文本处理,但内容又不是基于行的,你可以使用java.util.regex.Pattern类的splitAsStream(CharSequence)方法。它对上百万行的CSV文件或者你的classpath目录非常有用。

8.流化zip文件

说到类路径的扫描,你可以使用方便的stream()方法Stream你的ZipFiles和JarFiles,它们分别返回一个ZipEntry和JarEntry。不需要像java8流那样去深入查找你的classpath,并转换成JavaBeans。

如果你读到这里,你肯定了解到这些肯定不是Stream可以做到的全部东西。我觉得应该会有更多的博客文章带领我们深入Stream。但我觉得这些是一些潜在的好东西,可以让我们了解到流的潜力。使用lambdas和流扫描在你的classpath中找出定义在jar包中的JavaBeans?这里的新老技术共存的东西值得我们花上一些时间好好斟酌。

原文链接: speling.shemnon 翻译: ImportNew.com - 陈 晓舜
译文链接: http://www.importnew.com/10101.html
[ 转载请保留原文出处、译者和译文链接。]

关于作者: 陈 晓舜

(新浪微博:@shun记忆

查看陈 晓舜的更多文章 >>



相关文章

发表评论

Comment form

(*) 表示必填项

还没有评论。

跳到底部
返回顶部