Java 中的 Stream 流的使用

Java 中的 Stream API 提供了一系列强大的方法来处理集合和数组。Stream 类型是 Java 8 引入的,主要用于函数式编程,提供了一种高效、声明式的处理数据的方式。

以下是 Java Stream API 中的一些常用方法:

创建和转换 Stream

  • stream(): 从集合转换为 Stream。
  • of(T...): 从一组元素创建 Stream。
  • concat(Stream<? extends T> a, Stream<? extends T> b): 合并两个 Stream。
  • builder(): 使用 Builder 模式创建 Stream。
  • empty(): 创建一个空的 Stream。
  • generate(Supplier<T> s): 使用 Supplier 生成无限 Stream。
  • iterate(T seed, UnaryOperator<T> f): 从种子值开始,应用 UnaryOperator 来创建无限 Stream。

中间操作(Intermediate Operations)

  • filter(Predicate<? super T> predicate): 过滤 Stream 中的元素。
  • map(Function<? super T, ? extends R> mapper): 将元素转换为其他形式或提取信息。
  • flatMap(Function<? super T, ? extends Stream<? extends R>> mapper): 将 Stream 中的每个元素转换为其他形式的 Stream,然后将这些 Stream 连接起来。
  • distinct(): 返回一个去除重复元素后的 Stream。
  • sorted(): 对 Stream 进行排序。
  • peek(Consumer<? super T> action): 对每个元素执行操作并返回一个新的 Stream。
  • limit(long maxSize): 截取 Stream,使其最大长度不超过 maxSize。
  • skip(long n): 跳过前 n 个元素。

终结操作(Terminal Operations)

  • forEach(Consumer<? super T> action): 对每个元素执行操作。
  • forEachOrdered(Consumer<? super T> action): 按照 Stream 的遭遇顺序执行操作。
  • toArray(): 将 Stream 转换为数组。
  • reduce(BinaryOperator<T> accumulator): 执行归约操作,将 Stream 元素组合起来。
  • collect(Collector<? super T, A, R> collector): 将 Stream 转换为其他形式。
  • min(Comparator<? super T> comparator): 返回 Stream 的最小元素。
  • max(Comparator<? super T> comparator): 返回 Stream 的最大元素。
  • count(): 返回 Stream 中元素的数量。
  • anyMatch(Predicate<? super T> predicate): 检查是否至少有一个元素匹配给定的 Predicate。
  • allMatch(Predicate<? super T> predicate): 检查是否所有元素都匹配给定的 Predicate。
  • noneMatch(Predicate<? super T> predicate): 检查是否没有元素匹配给定的 Predicate。
  • findFirst(): 返回 Stream 的第一个元素(如果存在)。
  • findAny(): 返回 Stream 中的任何一个元素。

其他方法

  • parallel(): 将 Stream 转换为并行模式。
  • sequential(): 将 Stream 轤换为串行模式。
  • isParallel(): 检查 Stream 是否为并行。
  • iterator(): 返回 Stream 的迭代器。
  • spliterator(): 返回 Stream 的 Spliterator。

这些方法为您在处理集合和数组时提供了极大的灵活性和表达力。使用 Stream API,您可以以声明式方式编写复杂的数据处理查询,而不是使用复杂的循环和条件语句。

使用案例

当然,这里是一些 Stream API 方法的示例,用以展示如何在 Java 中使用这些方法:

创建 Stream

// 从集合创建 Stream
List<String> list = Arrays.asList("a", "b", "c");
Stream<String> stream = list.stream();

// 使用 Stream.of 创建 Stream
Stream<String> streamOfArray = Stream.of("a", "b", "c");

// 使用 Stream.generate 创建无限 Stream
Stream<Double> randomNumbers = Stream.generate(Math::random).limit(10);

中间操作(Intermediate Operations)

// 过滤
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6);
List<Integer> evenNumbers = numbers.stream()
    .filter(n -> n % 2 == 0)
    .collect(Collectors.toList());

// 转换
List<String> uppercaseStrings = stream
    .map(String::toUpperCase)
    .collect(Collectors.toList());

// 扁平化流
List<List<String>> listOfListOfString = Arrays.asList(
  Arrays.asList("a", "b"),
  Arrays.asList("c", "d")
);
List<String> flatList = listOfListOfString.stream()
    .flatMap(Collection::stream)
    .collect(Collectors.toList());

终结操作(Terminal Operations)

// 遍历
stream.forEach(System.out::println);

// 归约
int sum = numbers.stream().reduce(0, Integer::sum);

// 转换为集合
List<String> collected = stream.collect(Collectors.toList());

// 最小/最大值
Optional<String> minString = stream.min(String::compareTo);
Optional<String> maxString = stream.max(String::compareTo);

// 统计数量
long count = stream.count();

// 匹配
boolean anyMatch = stream.anyMatch(s -> s.contains("a"));
boolean allMatch = stream.allMatch(s -> s.length() > 0);
boolean noneMatch = stream.noneMatch(String::isEmpty);

// 查找元素
Optional<String> firstString = stream.findFirst();
Optional<String> anyString = stream.findAny();

其他方法

// 转换为并行流
Stream<String> parallelStream = list.parallelStream();

// 检查是否为并行
boolean isParallel = parallelStream.isParallel();

// 迭代器和分割器
Iterator<String> iterator = stream.iterator();
Spliterator<String> spliterator = stream.spliterator();

请注意,这些示例中的每个 Stream 操作(除了最后的终结操作)都返回一个新的 Stream 对象,您可以链式地调用这些方法。一旦执行了终结操作,流就不能再被使用了。

  • 33
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值