John Jiang

a cup of Java, cheers!
https://github.com/johnshajiang/blog

   :: 首页 ::  :: 联系 :: 聚合  :: 管理 ::
  131 随笔 :: 1 文章 :: 530 评论 :: 0 Trackbacks
Java流的8个特性
本文是稍早前java.net推荐的一篇博文,描述了Java流的8个有用的特性。(2014.03.07最后更新)

Lamba表达式是Java8到目前为止最棒的特性。但我认为有一个秘密武器展示了Lambda这一"语法糖"在提高代码可读性和可写性方面是何其的强大。当你在改进代码的表现力时,那么在对代码的理解方面你就上升到了新的境界,这能使最笨拙的工作变得简单。

是什么秘密武器呢?就是Java Stream API。最近我参与了一个在线比赛,就是在一个对性能要求较高的环境中简单地使用Java Stream。令我惊讶的是,这个API让编写主要的循环程序变得十分简单,而且能很好地适应我所做出的众多变化。下面就是我所学到的8个特性。

1. Java流不需要Lambda表达式
尽管这个API确实从Lambda表达式中获准良多,但你并不必非得使用Lambda。你可以回过去使用匿名内部类,但为什么要这么做呢?较可能的场景是,使用一个方法引用(例如Integer::valueOf),或者一个实例对象。使用方法引用可将复杂的多行逻辑置于循环体之外,就如你在优化一个hash set查找时所看到的。而实例对象可用于实现"四人帮"的策略模式。但请不要使用匿名内部类,除非你不得不这么做。

2. 窥入流内进行调试
你可以在流的任何位置放入你所想加进去的媒质,这个媒质称为peek。该操作使用了一个消费者对象,并期望不产生任何结果,因为Lambda一般只返回空。我喜欢把peek用于向系统发送调试信息,就如
.peek(System.out::println)
.peek(it 
-> System.out.printf("it is %s%n", it)

3. 流化随机成员
流并不局限于集合或数组,甚至是固定链表。如果你能创建一个Iterator或Supplier Lambda来创建流中的值,然后你就可以使用类java.util.stream.StreamSupport中的方法来创建一个流了。可以设想一个使用持续测量值,如内存消耗量或网络吞量,来驱动的流。

4. 流化随机数
如果你正在寻找一个简单的随机数,例如可以通过java.util.Random,这个类现在有了三个新的set方法ints(),longs()和doubles()来创建流。这些方法的重载版本可以让你设置边界,随机种子以及流中随机数的总量。

5. 流化I/O Reader
Java程序员的另一个常见工作就是一行一行地解析文件。现在java.io.BufferedReader有了一个新方法lines(),它会将I/O流转化为一个字符串流,以便于流的处理。

6. 流化文件树
如果访问的文件并不是你的菜,那就试试访问一个文件树会怎么样?类java.nio.file.Files中有几个方法都可以返回流。list()方法将列出一个目录下的所有文件,walk()方法将会递归地做到这一点,而filter()方法也会递归地访问这些文件,但会使用一些属性来进行过滤(当你有一个Path对象,有些事情会变得复杂起来)。你依然可以使用lines(Path)方法来通过流去获取内容。

7. 流化复杂文本
如果你依然念念不忘文本处理,但内容并不是基于行,那么就可以在java.util.regex.Pattern实例中使用splitAsStream(CharSequence)方法。这对于处理有数百万列的CSV文件或CLASSPATH十分有用。

8. 流化ZIP文件
说到对长CLASSPATH的搜索,你也可以很简单地调用名为stream的方法来流化java.util.zip.ZipFiles和java.util.jar.JarFiles,它会相应地返回一个ZipEntry或JarEntry实例。

如果你都已经干过这些事了,那么你肯定知道它们并不是Java流的基本用途。不过将来会有足够多的博文去涉及Java流的基础。我只是认为上述这些都是被掩藏起来的宝藏,它们揭示了Java流的潜质。
posted on 2014-02-28 15:25 John Jiang 阅读(1014) 评论(0)  编辑  收藏 所属分类: JavaSEJava翻译

只有注册用户登录后才能发表评论。


网站导航: