04 终端操作
终端操作(Terminal Operations
)总是我们在流管道中所做的最后一件事。
1 数组
toArray()
:将流转换成适当类型的数组。toArray(generator)
:在特殊情况下,生成自定义类型的数组。
package com.hcong.streams;import java.util.Arrays;
import java.util.Random;
import java.util.stream.IntStream;/*** @Classname RandInts* @Date 2023/4/14 19:43* @Created by HCong*/
public class RandInts {private static int[] rints = new Random(47).ints(0, 1000).limit(100).toArray();public static IntStream rands() {return Arrays.stream(rints);}
}
2 循环
forEach(Consumer)
:常见如System.out::println
作为Consumer
函数。forEachOrdered(Consumer)
:保证forEach
按照原始流顺序操作。
package com.hcong.streams;/*** @Classname ForEach* @Date 2023/4/14 19:47* @Created by HCong*/
public class ForEach {static final int SZ = 14;public static void main(String[] args) {RandInts.rands().limit(SZ).forEach(n -> System.out.format("%d ", n));System.out.println();RandInts.rands().limit(SZ).parallel().forEach(n -> System.out.format("%d ", n));System.out.println();RandInts.rands().limit(SZ).parallel().forEachOrdered(n -> System.out.format("%d ", n));}
}
在第一个流中,未使用 parallel()
,因此以元素从 rands()
出来的顺序输出结果。
在第二个流中,引入 parallel()
,即便流很小,输出的结果的顺序也和前面不一样。这是由于多处理器并行操作的原因,如果你将程序多运行几次,你会发现输出都不相同,这是多处理器并行操作的不确定性造成的结果。
在最后一个流中,同时使用了 parallel()
和 forEachOrdered()
来强制保持原始流顺序。因此,对非并行流使用 forEachOrdered()
是没有任何影响的。
3 集合
collect(Collector)
:使用Collector
收集流元素到结果集合中。collect(Supplier, BiConsumer, BiConsumer)
:同上,第一个参数Supplier
创建了一个新的结果集合,第二个参数BiConsumer
将下一个元素收集到结果集合中,第三个参数BiConsumer
用于将两个结果集合合并起来。
package com.hcong.streams;import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.Arrays;
import java.util.TreeSet;
import java.util.stream.Collectors;/*** @Classname TreeSetOfWords* @Date 2023/4/14 20:00* @Created by HCong*/
public class TreeSetOfWords {public static void main(String[] args) throws IOException {TreeSet<String> words = Files.lines(Paths.get("E:\\\\Projects\\\\IdeaProjects\\\\OnJava\\\\src\\\\com\\\\hcong\\\\streams\\\\Cheese.dat")).flatMap(s -> Arrays.stream(s.split("\\\\W+"))).filter(s -> !s.matches("\\\\d+")).map(String::trim).filter(s -> s.length() > 2).limit(100).collect(Collectors.toCollection(TreeSet::new));System.out.println(words);}
}
[And, Finest, Not, Well, certainly, cheese, clean, conclusion, district, leads, much, really, shop, sir, that, the, uncontaminated, what, you]
4 查找
findFirst()
:返回第一个流元素的Optional
,如果流为空返回Optional.empty
。findAny()
:返回含有任意流元素的Optional
,如果流为空返回Optional.empty
。
package com.hcong.streams;/*** @Classname SelectElement* @Date 2023/4/14 20:13* @Created by HCong*/
public class SelectElement {public static void main(String[] args) {System.out.println(RandInts.rands().findFirst().getAsInt());System.out.println(RandInts.rands().parallel().findFirst().getAsInt());System.out.println(RandInts.rands().findAny().getAsInt());}
}
258
258
258
5 信息
count()
:流中的元素个数。max(Comparator)
:根据所传入的Comparator
所决定的“最大” 元素。min(Comparator)
:根据所传入的Comparator
所决定的“最小” 元素。
package com.hcong.streams;/*** @Classname Informational* @Date 2023/4/14 20:17* @Created by HCong*/
public class Informational {public static void main(String[] args) throws Exception {System.out.println(FileToWords.stream("E:\\\\Projects\\\\IdeaProjects\\\\OnJava\\\\src\\\\com\\\\hcong\\\\streams\\\\Cheese.dat").count());System.out.println(FileToWords.stream("E:\\\\Projects\\\\IdeaProjects\\\\OnJava\\\\src\\\\com\\\\hcong\\\\streams\\\\Cheese.dat").min(String.CASE_INSENSITIVE_ORDER).orElse("NONE"));System.out.println(FileToWords.stream("E:\\\\Projects\\\\IdeaProjects\\\\OnJava\\\\src\\\\com\\\\hcong\\\\streams\\\\Cheese.dat").max(String.CASE_INSENSITIVE_ORDER).orElse("NONE"));}
}
23
And
you