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

JDK8中的Stream怎么用

发布时间:2023-05-14 07:50:24

Java 8 中新增的 Stream API,通过高度精简的操作方式,提供了一种新的集合数据处理方式,具有在大数据下更快、更高效的优点,同时也更容易进行并行操作。本文将介绍Stream的基本构造、操作方法及常见使用场景。

一、Stream的构造方法

Stream可以通过以下几种方式来构造:

1.通过Collection的stream()方法构造Stream:

List<String> list = Arrays.asList("a", "b", "c");
Stream<String> stream = list.stream();

2.通过Stream的静态方法of()、builder()方法构造Stream:

Stream<String> stream = Stream.of("1", "2", "3");
Stream<Integer> stream2 = Stream.builder().add(1).add(2).add(3).build();

3.其他方式构造Stream:

一些数组可以使用Arrays的stream()创建。

int[] arr = {1, 2, 3};
IntStream stream = Arrays.stream(arr);

二、Stream中的操作

Stream操作主要分为两种:中间操作和终止操作。中间操作主要用来对Stream进行处理,终止操作用来生成最终的结果。

1. 中间操作

(1) filter() 过滤操作:通过Predicate接口来实现

List<String> list = Arrays.asList("monkey", "lion", "giraffe", "lemur");
Stream<String> stream = list.stream().filter(str -> str.length() > 4);

(2) map() 转换操作:通过Function接口来实现

List<Integer> list = Arrays.asList(1, 2, 3);
Stream<Integer> stream = list.stream().map(i -> i * 2);

(3) flatMap() :通过Function接口来实现,可以将Stream扁平化为一个新的Stream

List<List<String>> list = new ArrayList<>();
List<String> a = Arrays.asList("hi");
List<String> b = Arrays.asList("hello");
list.add(a);
list.add(b);
Stream<String> stream = list.stream().flatMap(Collection::stream);

(4) distinct():去重操作,保证Stream中元素的 性。

(5) sorted():排序操作,保证Stream中元素的有序性,排序方式通过Comparator接口来实现。

List<Integer> list = Arrays.asList(4, 2, 1, 3);
List<Integer> sortedList = list.stream().sorted().collect(Collectors.toList());

(6) limit()、skip():截断操作,如保留Stream的前n个元素或者去除Stream的前n个元素等。

List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
Stream<Integer> stream = list.stream().skip(2).limit(2);

(7) peek():用于元素的辅助消费操作,主要用于调试

List<Integer> list = Arrays.asList(1,2,3);
Stream<Integer> stream = list.stream().peek(System.out::println);

2. 终止操作

(1) forEach():遍历操作,对Stream中的每个元素进行指定的操作。

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

(2) reduce():归约操作,可以通过指定的操作来将Stream中的元素汇聚成一个结果。

List<Integer> list = Arrays.asList(1,2,3);
Optional<Integer> result = list.stream().reduce(Integer::sum);

(3) collect():转换操作,通过指定的Collector将Stream转换为指定格式的数据结构。

List<Integer> list = Arrays.asList(1,2,3);
List<Integer> collect = list.stream().collect(Collectors.toList());

三、Stream的常见使用场景

(1) 数据查找

List<Integer> list = Arrays.asList(1,2,3,4,5,6);
Optional<Integer> num = list.stream().filter(x -> x > 3).findFirst();

(2) 数据转换

List<User> userList = new ArrayList<>();
List<String> nameList = userList.stream().map(User::getName).collect(Collectors.toList());

(3) 数据统计

List<Integer> list = Arrays.asList(1,2,3,4,5,6);
long count = list.stream().count(); // 计数
int max = list.stream().max(Integer::compareTo).get(); // 最大值
double average = list.stream().mapToInt(Integer::intValue).average().getAsDouble(); // 平均值

(4) 数据分组

List<Person> personList = List.of(
        new Person("Tom", 18),
        new Person("Jerry", 22),
        new Person("Mickey", 18),
        new Person("Donald", 20)
);
Map<Integer, List<Person>> map = personList.stream().collect(Collectors.groupingBy(Person::getAge));

总结:

Stream是Java 8中非常重要的特性之一。相比传统的迭代方式,Stream可以在处理大规模数据时具有更高效和方便的特点。本文介绍了Stream的基础语法和一些常见的操作方式,希望能为大家使用Stream提供一定的帮助。