终端操作(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