Stream流的操作方法
1. 什么是Stream流?
Stream(流)是Java 8中引入的一个新的概念,它允许以一种高效、可扩展和简洁的方式处理集合数据。Stream流可以看作是对集合进行一系列操作的管道,这些操作可以是过滤、映射、排序、归约等。
与传统的集合操作相比,Stream流具有以下特点: - Stream流不会改变原始数据源,而是通过生成一个新的Stream对象来返回结果。 - Stream流支持链式操作,可以将多个操作连接起来形成一个管道。 - Stream流可以并行处理数据,提高处理效率。
2. 创建Stream流
在Java中,可以通过多种方式创建Stream对象: - 从集合或数组创建:使用stream()方法从集合或数组中获取一个顺序流;使用parallelStream()方法获取一个并行流。 - 通过of()方法创建:使用Stream.of()方法直接创建一个包含指定元素的流。 - 使用generate()iterate()方法创建无限流:generate()方法根据提供的Supplier函数不断生成新元素;iterate()方法根据提供的
初始值和UnaryOperator函数生成无限序列。
下面是几个示例:
List<String> list = Arrays.asList("apple", "banana", "orange");
Stream<String> stream = list.stream(); // 创建顺序流
int[] array = {1, 2, 3, 4, 5};
IntStream intStream = Arrays.stream(array); // 创建顺序流
Stream<Integer> stream1 = Stream.of(1, 2, 3, 4, 5); // 创建顺序流
Stream<String> stream2 = Stream.generate(() -> "hello").limit(5); // 创建包含5个"hello"的无限流
Stream<Integer> stream3 = Stream.iterate(0, n -> n + 2).limit(5); // 创建包含0、2、4、6、8的无限流
3. Stream流的中间操作
Stream对象支持多种中间操作,这些操作可以对数据进行过滤、映射、排序等处理。
3.1 过滤操作
filter(Predicate<? super T> predicate):根据指定的条件过滤元素,只保留符合条件的元素。
distinct():去除重复元素。
limit(long maxSize):截断流,使其最大长度不超过指定值。
skip(long n):跳过指定数量的元素。
下面是一些示例:
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
// 过滤偶数
List<Integer> evenNumbers = numbers.stream()
                                  .filter(n -> n % 2 == 0)
                                  .collect(Collectors.toList());
// 去除重复元素
List<Integer> distinctNumbers = numbers.stream()
                                      .distinct()
                                      .collect(Collectors.toList());
// 只取前三个元素
List<Integer> limitedNumbers = numbers.stream()
                                      .limit(3)
                                      .collect(Collectors.toList());
// 跳过前两个元素
List<Integer> skippedNumbers = numbers.stream()
                                      .skip(2)
                                      .collect(Collectors.toList());
3.2 映射操作
map(Function<? super T, ? extends R> mapper):对流中的每个元素应用指定的函数,并将结果存储到新的流中。
flatMap(Function<? super T, ? extends Stream<? extends R>> mapper):对流中的每个元素应用指定的函数,并将每个函数返回的流合并成一个新的流。
下面是一些示例:
List<String> words = Arrays.asList("hello", "world");
/
/ 将每个单词转换为大写形式
List<String> upperCaseWords = words.stream()
                                  .map(String::toUpperCase)
                                  .collect(Collectors.toList());
// 将多个单词拆分为字符,并合并成一个新流
List<Character> characters = words.stream()
                                  .flatMap(word -> word.chars().mapToObj(c -> (char) c))
                                  .collect(Collectors.toList());
3.3 排序操作
sorted():对流中的元素进行自然排序。
sorted(Comparator<? super T> comparator):根据指定的比较器对流中的元素进行排序。
下面是一些示例:
List<Integer> numbers = Arrays.asList(4, 2, 1, 5, 3);
// 对数字进行升序排序
List<Integer> sortedNumbers = numbers.stream()
                                    .sorted()
                                    .collect(Collectors.toList());
// 对数字进行降序排序
List<Integer> reverseSortedNumbers = numbers.stream()
                                            .sorted(Comparator.reverseOrder())
                                            .collect(Collectors.toList());
4. Stream流的终端操作
Stream流的终端操作会触发流的处理,并生成一个结果或副作用。
4.1 收集操作
collect(Collector<? super T, A, R> collector):将流中的元素收集到一个可变容器中,如List、Set等。
toArray():将流中的元素收集到数组中。
下面是一些示例:
List<String> words = Arrays.asList("hello", "world");
// 将单词收集到List中
List<String> wordList = words.stream()
                            .collect(Collectors.toList());
// 将单词收集到Set中
Set<String> wordSet = words.stream()
                          .collect(Collectors.toSet());
// 将单词收集到数组中
String[] wordArray = words.stream()
                          .toArray(String[]::new);
4.2 归约操作
reduce(BinaryOperator<T> accumulator):对流中的元素进行归约操作,得到一个Optional对象。
reduce(T identity, BinaryOperator<T> accumulator):对流中的元素进行归约操作,得到一个结果对象。
下面是一些示例:
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
// 求和
Optional<Integer> sum sortedlist= numbers.stream()
                              .reduce(Integer::sum);
// 求乘积
Integer product = numbers.stream()
                        .reduce(1, (a, b) -> a * b);
4.3 遍历操作
forEach(Consumer<? super T> action):对流中的每个元素执行指定的操作。
forEachOrdered(Consumer<? super T> action):对流中的每个元素按顺序执行指定的操作。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。