【Stream】简化数据处理的强大工具

Java 8引入了Stream API,为集合框架提供了一种声明式处理数据的方式。Stream允许开发者以一种更简洁和可读的方式进行数据操作,如过滤、映射和归约等。本文将介绍Java Stream的基本使用方法和常见操作。

什么是Stream?

Stream是Java中的一个接口,它表示某种数据源的元素序列,并支持对这些元素进行聚合操作。与传统的迭代不同,Stream操作可以并行执行,提供了更高的性能。

创建Stream

Stream可以从各种数据源创建,例如集合、数组或生成器。以下是一些常见的创建方法:

import java.util.*;
import java.util.stream.*;

public class StreamExample {
    public static void main(String[] args) {
        // 从列表创建Stream
        List<String> list = Arrays.asList("a", "b", "c", "d");
        Stream<String> streamFromList = list.stream();

        // 从数组创建Stream
        String[] array = {"a", "b", "c", "d"};
        Stream<String> streamFromArray = Arrays.stream(array);

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

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

        // 使用Stream.iterate方法创建无限Stream
        Stream<Integer> streamIterated = Stream.iterate(0, n -> n + 2).limit(10);
    }
}

中间操作

中间操作是指那些返回另一个Stream的操作,这些操作是惰性执行的,即只有在需要终端操作的结果时才会实际执行。常见的中间操作有filter、map、sorted、distinct等。

过滤(filter)

过滤操作用于排除不符合条件的元素:

List<String> strings = Arrays.asList("abc", "", "bcd", "", "defg", "jk");
List<String> filtered = strings.stream()
    .filter(str -> !str.isEmpty())
    .collect(Collectors.toList());
System.out.println(filtered);

映射(map)

映射操作用于将每个元素转换为另一种形式:

List<Integer> numbers = Arrays.asList(3, 2, 2, 3, 7, 3, 5);
List<Integer> squaresList = numbers.stream()
    .map(i -> i * i)
    .distinct()
    .collect(Collectors.toList());
System.out.println(squaresList);

终端操作

终端操作会触发Stream的实际计算,返回一个结果或副作用。常见的终端操作有collect、forEach、reduce、count等。

收集(collect)

收集操作用于将Stream转换为其他形式,例如列表、集合等:

List<String> strings = Arrays.asList("abc", "", "bcd", "", "defg", "jk");
List<String> filtered = strings.stream()
    .filter(string -> !string.isEmpty())
    .collect(Collectors.toList());
System.out.println(filtered);

迭代(forEach)

迭代操作用于对Stream中的每个元素执行操作:

List<String> strings = Arrays.asList("abc", "", "bcd", "", "defg", "jk");
strings.stream()
    .filter(string -> !string.isEmpty())
    .forEach(System.out::println);

归约(reduce)

归约操作用于将Stream中的元素组合起来:

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
int sum = numbers.stream()
    .reduce(0, Integer::sum);
System.out.println(sum);

并行Stream

Stream API还提供了并行处理的能力,可以通过调用parallelStream方法创建并行Stream:

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
int sum = numbers.parallelStream()
    .reduce(0, Integer::sum);
System.out.println(sum);

并行Stream可以利用多核处理器的优势,提高处理大型数据集的性能。

总结

Java Stream API为处理集合提供了一种简洁且强大的工具。通过了解其基本用法和常见操作,我们可以编写出更高效和可读性更强的代码。在实际应用中,合理使用Stream可以显著提升代码的简洁性和运行性能。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值