java 怎么把list流化,Java Streams 8个很酷的特性

本文由ImportNew-陈 晓舜翻译自 speling.shemnon 。欢迎加入 Java小组 。转载请参见文章末尾的要求。

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?这里的新老技术共存的东西值得我们花上一些时间好好斟酌。

本文转载自:极客头条

欢迎加入我爱机器学习QQ14群:336582044

getqrcode.jpg

微信扫一扫,关注我爱机器学习公众号

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值