JAVA进阶-JAVA SE流库2
1.流的创建
可以用Collection接口的stram方法将任何集合转换为一个流。如果你有一个数组,可以使用静态Stream.of方法。
Stream<String> words = Stream.of(contents.split(","))
of方法具有可变长参数,因此可以构建具有任意数量引元的流:
String<String> song = Stream.of("aaa", "bbb", "ccc");
使用Array.stram(array, from. to)可以从数组中位于from(包括)和to(不包括)的元素创建一个流。
为了创建不包含任何元素的流。可以使用静态的Stream.empty方法:
Stream<String> silence = Stream.empty();
Stream接口有两个用于创建无限流的静态方法。generate方法会接受一个不包含任何引用元的函数(一个Supplier<T>接口的对象)。无论何时,只要需要一个流类型的值,该函数就会调用以产生这样的一个值。我们可以像下面这样获得一个常量值的流:
Stream<String> echos =Stram.generate(() -> "Echo");
或者引用
Stream<Double> randoms = Stream.generate(Math::random);
为了产生无限序列,例如0,1,2,3 。。。,可以使用iterate方法,他会接受一个"种子"值,以及一个函数(UnaryOperation<T>),并且会反复地将该函数应用到之前的结果上。
Stream<BigInteger> itegers = Stream.iteger(BigInteger.ZERO, n -> n.add(BigInteger.ONE));
该序列中的第一个元素是种子BigInteger.ZERO,第二个元素是f(seed),即1(作为大整数),下一个元素是f(f(seed)),即2.
在JavaAPI中有大量方法都可以产生流。如,Pattern类有一个solitAsStream方法,它会按照某个正则表达式来分隔一个CharSequence对象。可以使用下面的语句来将一个字符串分割为一个个的单词:
Stream<String> words = Pattern.compile("\\PL+").splitAsTream(contents);
静态的Files.lines方法返回一个包含文件所有行的Stream:
try (Stream<String> lines = Files.lines(path)) {
process lines
}
运行程序如下所示:
package com.fl.www; import lombok.extern.slf4j.Slf4j; import java.io.IOException; import java.math.BigInteger; import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.util.List; import java.util.regex.Pattern; import java.util.stream.Collectors; import java.util.stream.Stream; /** * @author : FL * @Classname : com.fl.www.CStream * @Version : * @date : 2019-08-02 16:17 * @describe : */ @Slf4j public class CStream { public static <T> void show(String title, Stream<T> stream) { final int size = 10; List<T> firstElements = stream.limit(size + 1).collect(Collectors.toList()); log.info(title + ":"); for (int i = 0; i < firstElements.size(); i++) { if (i > 0) { log.info(","); } if (i < size) { log.info(firstElements.get(i).toString()); } else { log.info("....."); } } } public static void main(String[] args) throws IOException { Path path = Paths.get("E:\\job\\MavenTest\\src\\main\\java\\resource.txt"); String arrStr = new String(Files.readAllBytes(path), StandardCharsets.UTF_8); Stream<String> stringStream = Stream.of(arrStr.split("\n")); show("stringSream", stringStream); Stream<String> song = Stream.of("aaa", "bbb", "ccc"); show("songs", song); Stream<String> silence = Stream.empty(); show("empty", silence); Stream<String> echo = Stream.generate(() -> "Echo"); show("Echo", echo); Stream<Double> randoms = Stream.generate(Math::random); show("randoms", randoms); Stream<BigInteger> bigIntegerStream = Stream.iterate(BigInteger.ZERO, n -> n.add(BigInteger.ONE)); show("integers", bigIntegerStream); Stream<String> wordsAnother = Pattern.compile("\n").splitAsStream(arrStr); show("wordsAnother", wordsAnother); try(Stream<String> lines = Files.lines(path, StandardCharsets.UTF_8)) { show("lines", lines); } } }
执行结果
2019-08-01 10:15:26 [main] INFO CRUDExample - 开始查询数据。。。 2019-08-01 10:15:26 [main] INFO CRUDExample - 结束操作... 2019-08-02 16:59:47 [main] INFO com.fl.www.CStream - stringSream: 2019-08-02 16:59:47 [main] INFO com.fl.www.CStream - 致命毒液 2019-08-02 16:59:47 [main] INFO com.fl.www.CStream - , 2019-08-02 16:59:47 [main] INFO com.fl.www.CStream - 2019-08-02 16:59:47 [main] INFO com.fl.www.CStream - , 2019-08-02 16:59:47 [main] INFO com.fl.www.CStream - 一路向西 2019-08-02 16:59:47 [main] INFO com.fl.www.CStream - , 2019-08-02 16:59:47 [main] INFO com.fl.www.CStream - 张建声 2019-08-02 16:59:47 [main] INFO com.fl.www.CStream - , 2019-08-02 16:59:47 [main] INFO com.fl.www.CStream - 喜剧之王(国语) 2019-08-02 16:59:47 [main] INFO com.fl.www.CStream - , 2019-08-02 16:59:47 [main] INFO com.fl.www.CStream - 周星驰 2019-08-02 16:59:47 [main] INFO com.fl.www.CStream - , 2019-08-02 16:59:47 [main] INFO com.fl.www.CStream - 聊斋金瓶梅 2019-08-02 16:59:47 [main] INFO com.fl.www.CStream - , 2019-08-02 16:59:47 [main] INFO com.fl.www.CStream - 午马 2019-08-02 16:59:47 [main] INFO com.fl.www.CStream - , 2019-08-02 16:59:47 [main] INFO com.fl.www.CStream - 流浪地球 2019-08-02 16:59:47 [main] INFO com.fl.www.CStream - , 2019-08-02 16:59:47 [main] INFO com.fl.www.CStream - 屈楚萧 2019-08-02 16:59:47 [main] INFO com.fl.www.CStream - , 2019-08-02 16:59:47 [main] INFO com.fl.www.CStream - ..... 2019-08-02 16:59:47 [main] INFO com.fl.www.CStream - songs: 2019-08-02 16:59:47 [main] INFO com.fl.www.CStream - aaa 2019-08-02 16:59:47 [main] INFO com.fl.www.CStream - , 2019-08-02 16:59:47 [main] INFO com.fl.www.CStream - bbb 2019-08-02 16:59:47 [main] INFO com.fl.www.CStream - , 2019-08-02 16:59:47 [main] INFO com.fl.www.CStream - ccc 2019-08-02 16:59:47 [main] INFO com.fl.www.CStream - empty: 2019-08-02 16:59:47 [main] INFO com.fl.www.CStream - Echo: 2019-08-02 16:59:47 [main] INFO com.fl.www.CStream - Echo 2019-08-02 16:59:47 [main] INFO com.fl.www.CStream - , 2019-08-02 16:59:47 [main] INFO com.fl.www.CStream - Echo 2019-08-02 16:59:47 [main] INFO com.fl.www.CStream - , 2019-08-02 16:59:47 [main] INFO com.fl.www.CStream - Echo 2019-08-02 16:59:47 [main] INFO com.fl.www.CStream - , 2019-08-02 16:59:47 [main] INFO com.fl.www.CStream - Echo 2019-08-02 16:59:47 [main] INFO com.fl.www.CStream - , 2019-08-02 16:59:47 [main] INFO com.fl.www.CStream - Echo 2019-08-02 16:59:47 [main] INFO com.fl.www.CStream - , 2019-08-02 16:59:47 [main] INFO com.fl.www.CStream - Echo 2019-08-02 16:59:47 [main] INFO com.fl.www.CStream - , 2019-08-02 16:59:47 [main] INFO com.fl.www.CStream - Echo 2019-08-02 16:59:47 [main] INFO com.fl.www.CStream - , 2019-08-02 16:59:47 [main] INFO com.fl.www.CStream - Echo 2019-08-02 16:59:47 [main] INFO com.fl.www.CStream - , 2019-08-02 16:59:47 [main] INFO com.fl.www.CStream - Echo 2019-08-02 16:59:47 [main] INFO com.fl.www.CStream - , 2019-08-02 16:59:47 [main] INFO com.fl.www.CStream - Echo 2019-08-02 16:59:47 [main] INFO com.fl.www.CStream - , 2019-08-02 16:59:47 [main] INFO com.fl.www.CStream - ..... 2019-08-02 16:59:47 [main] INFO com.fl.www.CStream - randoms: 2019-08-02 16:59:47 [main] INFO com.fl.www.CStream - 0.9283820636483764 2019-08-02 16:59:47 [main] INFO com.fl.www.CStream - , 2019-08-02 16:59:47 [main] INFO com.fl.www.CStream - 0.9612830001216989 2019-08-02 16:59:47 [main] INFO com.fl.www.CStream - , 2019-08-02 16:59:47 [main] INFO com.fl.www.CStream - 0.24824872516278118 2019-08-02 16:59:47 [main] INFO com.fl.www.CStream - , 2019-08-02 16:59:47 [main] INFO com.fl.www.CStream - 0.6731556142018678 2019-08-02 16:59:47 [main] INFO com.fl.www.CStream - , 2019-08-02 16:59:47 [main] INFO com.fl.www.CStream - 0.4594423973507742 2019-08-02 16:59:47 [main] INFO com.fl.www.CStream - , 2019-08-02 16:59:47 [main] INFO com.fl.www.CStream - 0.19395617319087333 2019-08-02 16:59:47 [main] INFO com.fl.www.CStream - , 2019-08-02 16:59:47 [main] INFO com.fl.www.CStream - 0.01983112181509028 2019-08-02 16:59:47 [main] INFO com.fl.www.CStream - , 2019-08-02 16:59:47 [main] INFO com.fl.www.CStream - 0.6167447007604158 2019-08-02 16:59:47 [main] INFO com.fl.www.CStream - , 2019-08-02 16:59:47 [main] INFO com.fl.www.CStream - 0.4637077729727006 2019-08-02 16:59:47 [main] INFO com.fl.www.CStream - , 2019-08-02 16:59:47 [main] INFO com.fl.www.CStream - 0.5505174768954472 2019-08-02 16:59:47 [main] INFO com.fl.www.CStream - , 2019-08-02 16:59:47 [main] INFO com.fl.www.CStream - ..... 2019-08-02 16:59:47 [main] INFO com.fl.www.CStream - integers: 2019-08-02 16:59:47 [main] INFO com.fl.www.CStream - 0 2019-08-02 16:59:47 [main] INFO com.fl.www.CStream - , 2019-08-02 16:59:47 [main] INFO com.fl.www.CStream - 1 2019-08-02 16:59:47 [main] INFO com.fl.www.CStream - , 2019-08-02 16:59:47 [main] INFO com.fl.www.CStream - 2 2019-08-02 16:59:47 [main] INFO com.fl.www.CStream - , 2019-08-02 16:59:47 [main] INFO com.fl.www.CStream - 3 2019-08-02 16:59:47 [main] INFO com.fl.www.CStream - , 2019-08-02 16:59:47 [main] INFO com.fl.www.CStream - 4 2019-08-02 16:59:47 [main] INFO com.fl.www.CStream - , 2019-08-02 16:59:47 [main] INFO com.fl.www.CStream - 5 2019-08-02 16:59:47 [main] INFO com.fl.www.CStream - , 2019-08-02 16:59:47 [main] INFO com.fl.www.CStream - 6 2019-08-02 16:59:47 [main] INFO com.fl.www.CStream - , 2019-08-02 16:59:47 [main] INFO com.fl.www.CStream - 7 2019-08-02 16:59:47 [main] INFO com.fl.www.CStream - , 2019-08-02 16:59:47 [main] INFO com.fl.www.CStream - 8 2019-08-02 16:59:47 [main] INFO com.fl.www.CStream - , 2019-08-02 16:59:47 [main] INFO com.fl.www.CStream - 9 2019-08-02 16:59:47 [main] INFO com.fl.www.CStream - , 2019-08-02 16:59:47 [main] INFO com.fl.www.CStream - ..... 2019-08-02 16:59:47 [main] INFO com.fl.www.CStream - wordsAnother: 2019-08-02 16:59:47 [main] INFO com.fl.www.CStream - 致命毒液 2019-08-02 16:59:47 [main] INFO com.fl.www.CStream - , 2019-08-02 16:59:47 [main] INFO com.fl.www.CStream - 2019-08-02 16:59:47 [main] INFO com.fl.www.CStream - , 2019-08-02 16:59:47 [main] INFO com.fl.www.CStream - 一路向西 2019-08-02 16:59:47 [main] INFO com.fl.www.CStream - , 2019-08-02 16:59:47 [main] INFO com.fl.www.CStream - 张建声 2019-08-02 16:59:47 [main] INFO com.fl.www.CStream - , 2019-08-02 16:59:47 [main] INFO com.fl.www.CStream - 喜剧之王(国语) 2019-08-02 16:59:47 [main] INFO com.fl.www.CStream - , 2019-08-02 16:59:47 [main] INFO com.fl.www.CStream - 周星驰 2019-08-02 16:59:47 [main] INFO com.fl.www.CStream - , 2019-08-02 16:59:47 [main] INFO com.fl.www.CStream - 聊斋金瓶梅 2019-08-02 16:59:47 [main] INFO com.fl.www.CStream - , 2019-08-02 16:59:47 [main] INFO com.fl.www.CStream - 午马 2019-08-02 16:59:47 [main] INFO com.fl.www.CStream - , 2019-08-02 16:59:47 [main] INFO com.fl.www.CStream - 流浪地球 2019-08-02 16:59:47 [main] INFO com.fl.www.CStream - , 2019-08-02 16:59:47 [main] INFO com.fl.www.CStream - 屈楚萧 2019-08-02 16:59:47 [main] INFO com.fl.www.CStream - , 2019-08-02 16:59:47 [main] INFO com.fl.www.CStream - ..... 2019-08-02 16:59:47 [main] INFO com.fl.www.CStream - lines: 2019-08-02 16:59:47 [main] INFO com.fl.www.CStream - 致命毒液 2019-08-02 16:59:47 [main] INFO com.fl.www.CStream - , 2019-08-02 16:59:47 [main] INFO com.fl.www.CStream - 2019-08-02 16:59:47 [main] INFO com.fl.www.CStream - , 2019-08-02 16:59:47 [main] INFO com.fl.www.CStream - 一路向西 2019-08-02 16:59:47 [main] INFO com.fl.www.CStream - , 2019-08-02 16:59:47 [main] INFO com.fl.www.CStream - 张建声 2019-08-02 16:59:47 [main] INFO com.fl.www.CStream - , 2019-08-02 16:59:47 [main] INFO com.fl.www.CStream - 喜剧之王(国语) 2019-08-02 16:59:47 [main] INFO com.fl.www.CStream - , 2019-08-02 16:59:47 [main] INFO com.fl.www.CStream - 周星驰 2019-08-02 16:59:47 [main] INFO com.fl.www.CStream - , 2019-08-02 16:59:47 [main] INFO com.fl.www.CStream - 聊斋金瓶梅 2019-08-02 16:59:47 [main] INFO com.fl.www.CStream - , 2019-08-02 16:59:47 [main] INFO com.fl.www.CStream - 午马 2019-08-02 16:59:47 [main] INFO com.fl.www.CStream - , 2019-08-02 16:59:47 [main] INFO com.fl.www.CStream - 流浪地球 2019-08-02 16:59:47 [main] INFO com.fl.www.CStream - , 2019-08-02 16:59:47 [main] INFO com.fl.www.CStream - 屈楚萧 2019-08-02 16:59:47 [main] INFO com.fl.www.CStream - , 2019-08-02 16:59:47 [main] INFO com.fl.www.CStream - .....
java.util.stream.Stream 8
- static <T> Stream<T> of(T...values):产生一个元素给定值的流
- static <T> Stram<T> empty():产生一个不包含任何元素的流
- static <T> Stream<T> iterate(T seed, UnaryOperator<T> f):产生一个无限流,他的元素包含种子,在种子上调用f产生的值、在前一个元素上调用f产生的值
java.util.Arrays 1.2
- static <T> Stram<T> stream(T[] array, int startInclusive, int endExclusive) 产生一个流,他的元素是由数组中指定范围内的元素构成的。
java.util.regex.Pattern1.4
- Stream<String> splitAsStream(CharSequence input):产生一盒六,他的元素是输入中由该模式界定的部分
java.nio.file.Files7
- static Stream<String> lines(Path path)
- static Stream<String> lines(Path path, CharSet cs):产生一个流,他的元素是指定文件中的行,改文件的字符集为cs
java.util.function.Supplier<T>
- T get():提供一个值。