ThinkSSL🔒 一键申购 5分钟快速签发 30天无理由退款 购买更放心 广告
### [正则表达式](https://lingcoder.gitee.io/onjava8/#/book/14-Streams?id=%e6%ad%a3%e5%88%99%e8%a1%a8%e8%be%be%e5%bc%8f) Java 的正则表达式将在[字符串](https://lingcoder.gitee.io/onjava8/#/18-Strings)这一章节详细介绍。Java 8 在`java.util.regex.Pattern`中增加了一个新的方法`splitAsStream()`。这个方法可以根据传入的公式将字符序列转化为流。但是有一个限制,输入只能是**CharSequence**,因此不能将流作为`splitAsStream()`的参数。 我们再一次查看将文件转换为单词的过程。这一次,我们使用流将文件转换为一个字符串,接着使用正则表达式将字符串转化为单词流。 ~~~ // streams/FileToWordsRegexp.java import java.io.*; import java.nio.file.*; import java.util.stream.*; import java.util.regex.Pattern; public class FileToWordsRegexp { private String all; public FileToWordsRegexp(String filePath) throws Exception { all = Files.lines(Paths.get(filePath)) .skip(1) // First (comment) line .collect(Collectors.joining(" ")); } public Stream<String> stream() { return Pattern .compile("[ .,?]+").splitAsStream(all); } public static void main(String[] args) throws Exception { FileToWordsRegexp fw = new FileToWordsRegexp("Cheese.dat"); fw.stream() .limit(7) .map(w -> w + " ") .forEach(System.out::print); fw.stream() .skip(7) .limit(2) .map(w -> w + " ") .forEach(System.out::print); } } ~~~ 输出结果: ~~~ Not much of a cheese shop really is it ~~~ 在构造器中我们读取了文件中的所有内容(跳过第一行注释,并将其转化成为单行字符串)。现在,当你调用`stream()`的时候,可以像往常一样获取一个流,但这次你可以多次调用`stream()`在已存储的字符串中创建一个新的流。这里有个限制,整个文件必须存储在内存中;在大多数情况下这并不是什么问题,但是这损失了流操作非常重要的优势: 1. “不需要把流存储起来。”当然,流确实需要一些内部存储,但存储的只是序列的一小部分,和存储整个序列不同。 2. 它们是懒加载计算的。 幸运的是,我们稍后就会知道如何解决这个问题。