寄生于黑暗中的光

寄生于黑暗中的光

终端操作(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
04-15 07:40