多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
### [generate()](https://lingcoder.gitee.io/onjava8/#/book/14-Streams?id=generate) 参照`RandomWords.java`中**Stream.**`generate()`搭配`Supplier<T>`使用的例子。代码示例: ~~~ // streams/Generator.java import java.util.*; import java.util.function.*; import java.util.stream.*; public class Generator implements Supplier<String> { Random rand = new Random(47); char[] letters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ".toCharArray(); public String get() { return "" + letters[rand.nextInt(letters.length)]; } public static void main(String[] args) { String word = Stream.generate(new Generator()) .limit(30) .collect(Collectors.joining()); System.out.println(word); } } ~~~ 输出结果: ~~~ YNZBRNYGCFOWZNTCQRGSEGZMMJMROE ~~~ 使用`Random.nextInt()`方法来挑选字母表中的大写字母。`Random.nextInt()`的参数代表可以接受的最大的随机数范围,所以使用数组边界是经过深思熟虑的。 如果要创建包含相同对象的流,只需要传递一个生成那些对象的`lambda`到`generate()`中: ~~~ // streams/Duplicator.java import java.util.stream.*; public class Duplicator { public static void main(String[] args) { Stream.generate(() -> "duplicate") .limit(3) .forEach(System.out::println); } } ~~~ 输出结果: ~~~ duplicate duplicate duplicate ~~~ 如下是在本章之前例子中使用过的`Bubble`类。**注意**它包含了自己的静态生成器(Static generator)方法。 ~~~ // streams/Bubble.java import java.util.function.*; public class Bubble { public final int i; public Bubble(int n) { i = n; } @Override public String toString() { return "Bubble(" + i + ")"; } private static int count = 0; public static Bubble bubbler() { return new Bubble(count++); } } ~~~ 由于`bubbler()`与`Supplier<Bubble>`是接口兼容的,我们可以将其方法引用直接传递给**Stream.**`generate()`: ~~~ // streams/Bubbles.java import java.util.stream.*; public class Bubbles { public static void main(String[] args) { Stream.generate(Bubble::bubbler) .limit(5) .forEach(System.out::println); } } ~~~ 输出结果: ~~~ Bubble(0) Bubble(1) Bubble(2) Bubble(3) Bubble(4) ~~~ 这是创建单独工厂类(Separate Factory class)的另一种方式。在很多方面它更加整洁,但是这是一个对于代码组织和品味的问题——你总是可以创建一个完全不同的工厂类。