Java Stream API的二度深入
前言
为什么会写这样一篇文章呢?
1.面试的时候,一位前辈对我这方面有过一次提问,我随口回答,前辈很信任我,以此文致敬前辈!
2.去回顾,去扎实,对得起前辈的信任!
3.Stream API 用起来很方便,所以很重要,所以还得学!
Stream API的三个阶段
在Java中,Stream 是Java 8引入的一个新概念,用于处理集合(Collections)数据的一种抽象。Java的Stream API 提供了一种声明式的方式来操作数据集合,可以用更简洁、可读性更强的代码来进行集合的操作。
Java Stream API的操作可以分为三个阶段:
-
创建流(Creation of Stream): 这个阶段涉及到从不同的数据源创建流,可以是集合、数组、I/O通道等。
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5); Stream<Integer> stream = numbers.stream();
-
中间操作(Intermediate Operations): 这个阶段包括对流的转换操作,可以对流进行过滤、映射、排序等操作。这些操作并不会改变原始数据源,而是返回一个新的流。
Stream<Integer> filteredStream = stream.filter(x -> x > 2);
-
终端操作(Terminal Operations): 这个阶段是对流进行最终操作,触发流的遍历,可以产生一个结果或者副作用。终端操作是流的最后一个操作,执行后流将不可再用。
long count = filteredStream.count();
这三个阶段的设计使得可以通过链式调用的方式组合多个操作,从而编写更为清晰和简洁的代码。这种方式也有助于提高代码的可读性和可维护性。
当然,这里只是对于Stream API
三个阶段的概述,只是告诉大家,简单分为三个阶段,至于三个阶段里面有哪些主要的方法,我们在下文进行详细叙述,这里我们点到为止!现在,大家心里面就应该有这么一个蓝图,或者是基本框架,知道我们接下来将会沿着那个几个方向展开叙述!
创建Stream
流
在Java中,你可以使用多种方式来创建Stream流。
-
从集合创建:
使用集合类的
stream()
或parallelStream()
方法可以创建对应的流。例如:List<String> list = Arrays.asList("apple", "banana", "orange"); Stream<String> streamFromList = list.stream();
-
从数组创建:
使用
Arrays.stream()
方法可以从数组中创建流:String[] array = { "apple", "banana", "orange"}; Stream<String> streamFromArray = Arrays.stream(array);
-
通过Stream的静态方法创建:
Stream
类提供了静态方法of()
,可以传入一系列元素来创建流:Stream<String> stream = Stream.of("apple", "banana", "orange");
-
使用Stream的
generate
和iterate
方法:Stream
类还提供了generate
和iterate
方法,用于生成无限流:// 生成包含随机整数的无限流 Stream<Integer> infiniteStream = Stream.generate(() -> (int) (Math.random() * 100)); // 从指定的起始值开始,按照某个规则生成无限流 Stream<Integer> sequentialStream = Stream.iterate(1, n -> n + 1);
-
通过文件生成流:
java.nio.file.Files
类提供了静态方法lines()
,可以用来读取文件内容并生成流:Path path = Paths.get("example.txt"); Stream<String> fileLines = Files.lines(path);
-
使用正则表达式生成流:
Pattern
类的splitAsStream
方法可以根据正则表达式将字符串分割成流:String text = "apple,orange,banana"; Stream<String> textStream = Pattern.compile(",").splitAsStream(text