Java Stream流是Java 8引入的一种新特性,旨在以一种简洁、高效的方式对集合进行处理。Stream流是对集合功能的一种增强,它允许以声明性方式处理数据集合,借助流的操作可以轻松实现过滤、映射、排序、聚合等操作。

什么是Stream流

Stream流并不是数据结构,而是对数据源(如集合、数组等)进行操作的业务逻辑。Stream可以极大地方便我们进行数据处理,并提供了高性能和并行处理的能力。我们可以使用Stream来实现函数式编程风格的操作,代码更加简洁明了。

创建Stream流

Java中可以通过多种方式创建Stream流,下面是一些常见的创建方式:

  1. 从集合创建
  2. 从数组创建
  3. 通过Stream.of()方法
import java.util.Arrays;
import java.util.List;
import java.util.stream.Stream;

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

        // 从数组创建
        String[] array = {"e", "f", "g"};
        Stream<String> streamFromArray = Arrays.stream(array);

        // 使用Stream.of()方法
        Stream<String> streamOf = Stream.of("h", "i", "j");
    }
}

Stream流的常用操作

Java Stream流支持多种操作,这些操作通常分为中间操作和终止操作。

1. 中间操作

中间操作返回的是一个新的Stream流,这些操作是惰性求值的。常用的中间操作有filter、map、distinct等。

  • filter:过滤流中的元素。
  • map:对每个元素应用一个函数并返回一个新流。
  • distinct:去重。
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

public class StreamOperationsExample {
    public static void main(String[] args) {
        List<String> list = Arrays.asList("apple", "banana", "apple", "orange", "banana");

        List<String> distinctFruits = list.stream()
                .distinct()
                .collect(Collectors.toList());

        System.out.println("去重后的水果列表: " + distinctFruits);

        // 使用filter过滤出包含字母'a'的水果
        List<String> filteredFruits = list.stream()
                .filter(fruit -> fruit.contains("a"))
                .collect(Collectors.toList());

        System.out.println("过滤后包含'a'的水果: " + filteredFruits);

        // 使用map将每个水果转换为大写
        List<String> upperCaseFruits = list.stream()
                .map(String::toUpperCase)
                .collect(Collectors.toList());

        System.out.println("大写水果列表: " + upperCaseFruits);
    }
}

2. 终止操作

终止操作会产生一个结果或副作用,常用的终止操作有forEach、count、collect、reduce等。

  • forEach:对流中的每个元素进行操作。
  • count:计算流中的元素数量。
  • collect:将流中的元素收集到集合中。
  • reduce:对流中的元素进行聚合操作。
import java.util.Arrays;
import java.util.List;

public class StreamTerminalOperationsExample {
    public static void main(String[] args) {
        List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);

        // 使用forEach打印每个数字
        System.out.println("每个数字:");
        numbers.stream().forEach(System.out::println);

        // 使用count计算元素数量
        long count = numbers.stream().count();
        System.out.println("数字的数量: " + count);

        // 使用reduce计算总和
        int sum = numbers.stream()
                .reduce(0, Integer::sum);
        System.out.println("数字的总和: " + sum);
    }
}

并行处理

Stream流还支持并行处理,使用parallelStream()方法可以很方便地实现流的并行操作,充分利用多核处理器的优势。

public class ParallelStreamExample {
    public static void main(String[] args) {
        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);
    }
}

总结

Java Stream流为我们提供了一种高效、简洁的处理集合的方法。通过Stream流,我们可以使用函数式编程的理念,轻松实现复杂的数据处理逻辑。随着对流的深入理解,我们能更好地利用其优势,实现更高效的代码。

点赞(0) 打赏

微信小程序

微信扫一扫体验

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部