JDK8中的Stream怎么用
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提供一定的帮助。
