用AI赚第一桶💰低成本搭建一套AI赚钱工具,源码可二开。 广告
### [流的建造者模式](https://lingcoder.gitee.io/onjava8/#/book/14-Streams?id=%e6%b5%81%e7%9a%84%e5%bb%ba%e9%80%a0%e8%80%85%e6%a8%a1%e5%bc%8f) 在建造者模式(Builder design pattern)中,首先创建一个`builder`对象,然后将创建流所需的多个信息传递给它,最后`builder`对象执行”创建“流的操作。**Stream**库提供了这样的`Builder`。在这里,我们重新审视文件读取并将其转换成为单词流的过程。代码示例: ~~~ // streams/FileToWordsBuilder.java import java.io.*; import java.nio.file.*; import java.util.stream.*; public class FileToWordsBuilder { Stream.Builder<String> builder = Stream.builder(); public FileToWordsBuilder(String filePath) throws Exception { Files.lines(Paths.get(filePath)) .skip(1) // 略过开头的注释行 .forEach(line -> { for (String w : line.split("[ .?,]+")) builder.add(w); }); } Stream<String> stream() { return builder.build(); } public static void main(String[] args) throws Exception { new FileToWordsBuilder("Cheese.dat") .stream() .limit(7) .map(w -> w + " ") .forEach(System.out::print); } } ~~~ 输出结果: ~~~ Not much of a cheese shop really ~~~ **注意**,构造器会添加文件中的所有单词(除了第一行,它是包含文件路径信息的注释),但是其并没有调用`build()`。只要你不调用`stream()`方法,就可以继续向`builder`对象中添加单词。 在该类的更完整形式中,你可以添加一个标志位用于查看`build()`是否被调用,并且可能的话增加一个可以添加更多单词的方法。在`Stream.Builder`调用`build()`方法后继续尝试添加单词会产生一个异常。