欢迎访问宙启技术站
智能推送

Java中的StreamAPI详解和使用示例

发布时间:2023-06-17 05:38:22

Java中的StreamAPI是一种新的操作集合和数组的方式,通过提供一组丰富的功能和操作,使得对数据的操作变得更加简单、灵活和高效。本文将详细介绍StreamAPI的概念、使用方法以及常见操作示例。

1. 概述

StreamAPI是Java8新引入的一个API,其主要目的是为集合和数组提供一种新的操作方式。在传统的Java中,对于集合和数组的操作,通常需要使用迭代器或者for循环进行遍历和操作。但是这种方式通常比较繁琐,代码也比较冗长。StreamAPI就是为了解决这个问题而出现的,它提供了一组丰富的功能和操作,使得对数据的操作变得更加简单、灵活和高效。

2. 使用方法

StreamAPI的使用方法比较简单,我们只需要基于一个集合或者数组创建一个Stream对象,然后就可以对其进行一些操作了。具体的使用方法如下:

//1.通过Collection创建Stream
List<String> list = Arrays.asList("Apple", "Banana", "Orange", "Pear");
Stream<String> stream = list.stream();

//2.通过数组创建Stream
int[] arr = {1, 2, 3, 4, 5};
IntStream intStream = Arrays.stream(arr);

//3.通过Stream.of()创建Stream
Stream<String> stream1 = Stream.of("Apple", "Banana", "Orange", "Pear");

//4.通过Stream.generate()创建无限流
Stream<Integer> stream2 = Stream.generate(() -> new Random().nextInt(100));

//5.通过Stream.iterate()创建无限流
Stream<Integer> stream3 = Stream.iterate(0, n -> n + 2);

在创建了Stream对象之后,我们就可以对其进行一些操作了。常见的操作包括:

1. filter:对Stream中的元素进行过滤。

2. map:对Stream中的元素进行转换。

3. flatMap:将Stream中的元素通过flatMap映射成多个Stream,再将其合并成一个Stream。

4. distinct:去除Stream中重复的元素。

5. sorted:将Stream中的元素进行排序。

6. limit:截取Stream中的前几个元素。

7. skip:跳过Stream中的前几个元素。

8. count:返回Stream中元素的个数。

9. forEach:对Stream中的每个元素执行指定的操作。

10. reduce:将Stream中的元素进行聚合操作。

下面将分别介绍这些操作的使用方法和示例。

3. 操作示例

3.1 filter

filter操作可以根据指定的条件对Stream中的元素进行过滤,只返回符合条件的元素。示例代码如下:

List<String> list = Arrays.asList("Apple", "Banana", "Orange", "Pear");
Stream<String> stream = list.stream();
stream.filter(str -> str.startsWith("A")).forEach(System.out::println); //输出 Apple

这段代码的意思是,先将列表list转换成Stream对象,然后调用filter方法,过滤出以字母"A"开头的元素,最后使用forEach方法,将过滤出的元素依次输出到控制台。

3.2 map

map操作可以将Stream中的元素进行转换,返回一个新的Stream对象。示例代码如下:

List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
Stream<Integer> stream = list.stream();
stream.map(n -> n * n).forEach(System.out::println); //输出 1 4 9 16 25

这段代码的意思是,先将列表list转换成Stream对象,然后调用map方法,将Stream中的每个元素都平方,并返回一个新的Stream对象,最后使用forEach方法,将新的Stream中的元素依次输出到控制台。

3.3 flatMap

flatMap操作可以将Stream中的元素进行扁平化,将其中的每个元素映射成多个Stream,然后将这些Stream合并成一个新的Stream对象。示例代码如下:

List<String> list1 = Arrays.asList("A", "B");
List<String> list2 = Arrays.asList("C", "D");
Stream<List<String>> stream = Stream.of(list1, list2);
stream.flatMap(Collection::stream).forEach(System.out::println); //输出 A B C D

这段代码的意思是,先将列表list1和list2转换成Stream对象,然后使用Stream.of将这两个Stream合并成一个新的Stream对象,然后调用flatMap方法,将其中的每个元素映射成一个Stream,最后将这些Stream合并成一个新的Stream对象,使用forEach方法将新的Stream中的元素依次输出到控制台。

3.4 distinct

distinct操作可以去除Stream中重复的元素。示例代码如下:

List<Integer> list = Arrays.asList(1, 2, 2, 3, 3, 3);
Stream<Integer> stream = list.stream();
stream.distinct().forEach(System.out::println); //输出 1 2 3

这段代码的意思是,先将列表list转换成Stream对象,然后调用distinct方法,去除其中重复的元素,最后使用forEach方法,将新的Stream中的元素依次输出到控制台。

3.5 sorted

sorted操作可以将Stream中的元素进行排序。示例代码如下:

List<Integer> list = Arrays.asList(3, 1, 4, 2, 5);
Stream<Integer> stream = list.stream();
stream.sorted().forEach(System.out::println); //输出 1 2 3 4 5

这段代码的意思是,先将列表list转换成Stream对象,然后调用sorted方法,将其中的元素进行排序,最后使用forEach方法,将新的Stream中的元素依次输出到控制台。

3.6 limit

limit操作可以截取Stream中的前几个元素。示例代码如下:

List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
Stream<Integer> stream = list.stream();
stream.limit(3).forEach(System.out::println); //输出 1 2 3

这段代码的意思是,先将列表list转换成Stream对象,然后调用limit方法,截取前三个元素,最后使用forEach方法,将新的Stream中的元素依次输出到控制台。

3.7 skip

skip操作可以跳过Stream中的前几个元素。示例代码如下:

List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
Stream<Integer> stream = list.stream();
stream.skip(3).forEach(System.out::println); //输出 4 5

这段代码的意思是,先将列表list转换成Stream对象,然后调用skip方法,跳过前三个元素,最后使用forEach方法,将新的Stream中的元素依次输出到控制台。

3.8 count

count操作可以返回Stream中元素的个数。示例代码如下:

List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
Stream<Integer> stream = list.stream();
long count = stream.count();
System.out.println(count); //输出 5

这段代码的意思是,先将列表list转换成Stream对象,然后调用count方法,返回其中元素的个数,最后将个数输出到控制台。

3.9 forEach

forEach操作可以对Stream中的每个元素执行指定的操作。示例代码如下:

List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
Stream<Integer> stream = list.stream();
stream.forEach(System.out::println); //输出 1 2 3 4 5

这段代码的意思是,先将列表list转换成Stream对象,然后使用forEach方法,将其中的每个元素依次输出到控制