Java中的StreamAPI详解和使用示例
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方法,将其中的每个元素依次输出到控制
