探索Java Stream:简化代码,提升效率的利器

Java编程领域,Stream已经成为了一种不可或缺的工具,它提供了一种更为优雅、简洁的方式来处理集合数据。

什么是Java Stream?

Java 8引入了Stream API,它是一种用于处理集合数据的高级抽象,提供了丰富的操作方法,可以在不改变原始数据结构的情况下,进行流畅的数据处理。

Stream可以让我们以声明性的方式对集合进行操作,而不是传统的命令式编程方式。通过Stream,我们可以更加专注于数据的转换和处理逻辑,而不必关心底层的迭代和临时变量的维护,大大简化了代码。

常用方法

1. map() 方法

map() 方法用于对Stream中的每个元素进行映射操作,将输入的元素转换为另一种形式输出。

示例代码:

List<String> words = Arrays.asList("apple""banana""cherry");
List<Integer> wordLengths = words.stream()
                                .map(String::length)
                                .collect(Collectors.toList());
System.out.println(wordLengths); // 输出: [5, 6, 6]

2. filter() 方法

filter() 方法用于根据指定的条件过滤Stream中的元素,只保留满足条件的元素。

示例代码:

List<String> fruits = Arrays.asList("apple""banana""cherry");
List<String> filteredFruits = fruits.stream()
                                    .filter(fruit -> fruit.startsWith("a"))
                                    .collect(Collectors.toList());
System.out.println(filteredFruits); // 输出: [apple]

3. reduce() 方法

reduce() 方法用于将Stream中的所有元素组合成一个结果,可以是求和、求积、连接字符串等操作。

示例代码:

List<Integer> numbers = Arrays.asList(12345);
int sum = numbers.stream()
                .reduce(0, Integer::sum);
System.out.println(sum); // 输出: 15

4. forEach() 方法

forEach() 方法用于对Stream中的每个元素执行指定的操作。

示例代码:

List<String> fruits = Arrays.asList("apple""banana""cherry");
fruits.stream()
        .forEach(System.out::println);
// 输出:
// apple
// banana
// cherry

5. collect() 方法

collect() 方法用于将Stream中的元素收集到一个集合中,可以是List、Set、Map等类型。

示例代码:

List<String> fruits = Arrays.asList("apple""banana""cherry");
Set<String> fruitSet = fruits.stream()
                            .collect(Collectors.toSet());
System.out.println(fruitSet); // 输出: [apple, banana, cherry]

6. sorted() 方法

sorted() 方法用于对Stream中的元素进行排序,默认是自然排序,也可以通过传入Comparator进行自定义排序。

示例代码:

List<String> fruits = Arrays.asList("banana""apple""cherry");
List<String> sortedFruits = fruits.stream()
                                    .sorted()
                                    .collect(Collectors.toList());
System.out.println(sortedFruits); // 输出: [apple, banana, cherry]

7. distinct() 方法

distinct() 方法用于去除Stream中重复的元素,保留唯一的元素。

示例代码:

List<String> fruits = Arrays.asList("apple""banana""apple""cherry");
List<String> distinctFruits = fruits.stream()
                                        .distinct()
                                        .collect(Collectors.toList());
System.out.println(distinctFruits); // 输出: [apple, banana, cherry]

当然,请看下面列举的一些Java Stream的进阶用法:

8. flatMap() 方法

flatMap() 方法用于将多个Stream合并成一个Stream,并且将每个Stream中的元素映射为一个新的Stream,然后合并成一个Stream。

示例代码:

List<List<Integer>> numbers = Arrays.asList(Arrays.asList(12), Arrays.asList(34), Arrays.asList(56));
List<Integer> flatList = numbers.stream()
                                .flatMap(Collection::stream)
                                .collect(Collectors.toList());
System.out.println(flatList); // 输出: [1, 2, 3, 4, 5, 6]

9. groupingBy() 方法

groupingBy() 方法用于根据指定的条件对Stream中的元素进行分组。

示例代码:

List<String> fruits = Arrays.asList("apple""banana""cherry""blueberry");
Map<Character, List<String>> groupedByFirstChar = fruits.stream()
                                                        .collect(Collectors.groupingBy(s -> s.charAt(0)));
System.out.println(groupedByFirstChar); // 输出: {a=[apple], b=[banana, blueberry], c=[cherry]}

10. partitioningBy() 方法

partitioningBy() 方法用于根据指定的条件对Stream中的元素进行分区,将元素分为两组:满足条件和不满足条件。

示例代码:

List<String> fruits = Arrays.asList("apple""banana""cherry""blueberry");
Map<Boolean, List<String>> partitionedByLength = fruits.stream()
                                                        .collect(Collectors.partitioningBy(s -> s.length() > 5));
System.out.println(partitionedByLength); // 输出: {false=[apple, banana, cherry], true=[blueberry]}

11. peek() 方法

peek() 方法用于在Stream的每个元素上执行操作,同时保留Stream的流程。

示例代码:

List<String> fruits = Arrays.asList("apple""banana""cherry");
List<String> upperCaseFruits = fruits.stream()
                                    .peek(s -> System.out.println("Processing: " + s))
                                    .map(String::toUpperCase)
                                    .collect(Collectors.toList());
// 输出:
// Processing: apple
// Processing: banana
// Processing: cherry
System.out.println(upperCaseFruits); // 输出: [APPLE, BANANA, CHERRY]

12. limit() 和 skip() 方法

limit() 方法用于截断Stream,使其最多保留指定数量的元素。skip() 方法用于跳过指定数量的元素,返回剩余元素。

示例代码:

List<Integer> numbers = Arrays.asList(12345);
List<Integer> limitedNumbers = numbers.stream()
                                        .limit(3)
                                        .collect(Collectors.toList());
System.out.println(limitedNumbers); // 输出: [1, 2, 3]

List<Integer> skippedNumbers = numbers.stream()
                                        .skip(2)
                                        .collect(Collectors.toList());
System.out.println(skippedNumbers); // 输出: [3, 4, 5]

结语

Java Stream提供了一种更为优雅、简洁的方式来处理集合数据,能够大大提升编码效率和代码可读性。


原文始发于微信公众号(连帆起航):探索Java Stream:简化代码,提升效率的利器

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/239238.html

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!