> 文章列表 > 04 终端操作

04 终端操作

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