在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(1, 2, 3, 4, 5);
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(1, 2), Arrays.asList(3, 4), Arrays.asList(5, 6));
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(1, 2, 3, 4, 5);
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