Java Stream必知必会

欣喜 Java经验 发布时间:2025-01-10 14:49:54 阅读数:971 1
下文笔者讲述Java中Stream的使用方法大全,如下所示

Java之Stream简介说明

在JDK1.8之后
  Stream为我们的程序提供快捷操作集合的方法
   如:Stream集合提供
       过滤、映射、排序、聚合等
	   使我们编写代码方法,下文笔者将讲述一些具体的使用方法,如下所示

创建 Stream


list<String> list = Arrays.asList("java265.com", "java编程网站", "最爱的java语言");
Stream<String> stream1 = list.stream();

借助数组创建 Stream
  可使用 Arrays.stream()方法创建stream
  
String[] array = {"java265.com", "java编程网站", "最爱的java语言"};
Stream<String> stream2 = Arrays.stream(array);

Stream中间操作

filter:
  用于过滤元素
     可以指定过滤条件
	 
例:过滤 b开头的字符串 
 
list.stream()
   .filter(s -> s.startsWith("b"))
   .forEach(System.out::println); // 输出: apple


map
   转换元素
   map方法的功能:
     将流中的每个元素按照指定的函数进行转换
	 如:
	   将字符串转换为大写:
 
list.stream()
   .map(String::toUpperCase)
   .forEach(System.out::println); // 输出: APPLE BANANA CHERRY

终止操作

 forEach:
    遍历元素
 forEach方法
    用于遍历流中的每个元素并执行指定的操作
	
例
  list.stream().forEach(System.out::println);
   collect
     收集结果到集合
   collect方法的功能
     将流中的元素收集到指定的集合中

例:
  获取长度大于 8字符串到一个新的列表中:

List<String> result1 = list.stream()
   .filter(s -> s.length() > 8)
   .collect(Collectors.toList());

// 或者使用 toList() 方法(Java 16 及以上版本)
List<String> result2 = list.stream()
   .filter(s -> s.length() > 5)
   .toList();

Stream中级用法

1.排序

 sorted
   自然排序或自定义排序
 
 sorted方法可以对流中的元素进行排序
  当元素实现Comparable接口
   可直接使用无参sorted 方法进行自然排序
 
 例:
list.stream()
   .sorted()
   .forEach(System.out::println);  

如需要自定义排序规则
  可传入一个Comparator比较器
  例:
    按照字符串长度倒序排序
	
list.stream()
   .sorted(Comparator.reverseOrder())
   .forEach(System.out::println);

2.去重

使用distinct方法可以去除流中的重复元素
 例:
List<Integer> numbers = Arrays.asList(1, 2, 2, 3, 4, 4, 5);
List<Integer> distinctNumbers = numbers.stream()
   .distinct()
   .toList();

3.聚合操作

    reduce
	   归约操作
	reduce方法可以对流中的元素进行归约操作

例
  求和、求乘积等

Optional<Integer> sum = numbers.stream()
   .reduce((a, b) -> a + b); // 可替换为.reduce(Integer::sum);
System.out.println(sum.get()); // 输出: 19

三、高级用法

1.并行流

    parallelStream
	  并行处理(提高效率)
	   使用parallelStream方法可创建一个并行流
	   它会在多个线程上并行处理流中的元素,提高处理效率
	例:
	  计算满足条件的元素数量
long count = list.parallelStream()
   .filter(s -> s.length() > 5)
   .count();

2.短路操作

    anyMatch、allMatch、noneMatch:短路匹配:这些方法用于在流中进行短路匹配操作。
        anyMatch:只要流中有一个元素满足条件就返回 true
	例:
 
boolean anyStartsWithA = list.stream()
   .anyMatch(s -> s.startsWith("j"));
System.out.println(anyStartsWithA); // 输出: true
 
 allMatch:
   只有流中所有元素都满足条件才返回 true
   例如:
 
boolean allStartsWithA = list.stream()
   .allMatch(s -> s.startsWith("a"));
System.out.println(allStartsWithA); // 输出: false

noneMatch:
  如果流中没有元素满足条件则返回true
  例:
boolean noneStartsWithZ = list.stream()
   .noneMatch(s -> s.startsWith("z"));
System.out.println(noneStartsWithZ); // 输出: true

3.分组和分区

 Collectors.groupingBy:
    分组
 使用groupingBy方法可以根据指定的分类函数将流中的元素分组到一个Map中
  例:
    根据字符串的首字母进行分组
Map<Character, List<String>> groupedByFirstLetter = list.stream()
   .collect(Collectors.groupingBy(s -> s.charAt(0)));
System.out.println(groupedByFirstLetter); // {a=[apple], b=[banana], c=[cherry]}

 Collectors.partitioningBy:
    分区
  partitioningBy方法根据指定的布尔条件将流中的元素分区到一个Map中
    键为true和false
	例:
	  根据字符串长度是否大于 5 进行分区:
 
Map<Boolean, List<String>> partitioned = list.stream()
   .collect(Collectors.partitioningBy(s -> s.length() > 5));  
System.out.println(partitioned);

4.收集到Map

 Collectors.toMap
   收集到Map
     使用toMap方法可以将流中的元素收集到一个Map中
	  需要指定键和值的映射函数
	   例
Map<String, Integer> map = list.stream()
   .collect(Collectors.toMap(Function.identity(), String::length));
System.out.println(map);

flatMap用法

flatMap方法
 用于将流中每个元素转换为另一个流
 然后将这些流扁平化成一个单一流
  这在处理嵌套集合时非常有用
  例
List<List<String>> listOfLists = Arrays.asList(
    Arrays.asList("apple", "banana"),
    Arrays.asList("cherry", "date"),
    Arrays.asList("fig", "grape")
);

// 使用 flatMap 将嵌套列表扁平化
List<String> flattenedList = listOfLists.stream()
   .flatMap(List::stream)
   .collect(Collectors.toList());

System.out.println(flattenedList);  

peek用法

peek方法
  用于调试
  它允许在流的每个元素上执行某个操作(如打印)
   而不会改变流中的元素
    peek 返回一个新的流
	其中包含与原始流相同的元素
	例
List<String> list = Arrays.asList("java265.com", "java编程网站", "最爱的java语言");

List<String> result = list.stream()
   .peek(s -> System.out.println("Processing: " + s)) // 打印每个元素
   .map(String::toUpperCase)
   .collect(Collectors.toList());

System.out.println(result);  

limit用法

limit方法
  用于限制流中的元素数量
   例

List<String> list = Arrays.asList("apple", "banana", "cherry", "date", "fig", "grape");

List<String> limitedList = list.stream()
   .limit(3)
   .collect(Collectors.toList());

System.out.println(limitedList); // 输出: [apple, banana, cherry]

skip用法

skip方法
  用于跳过流中前n个元素
  
  例
List<String> list = Arrays.asList("apple", "banana", "cherry", "date", "fig", "grape");

List<String> skippedList = list.stream()
   .skip(3)
   .collect(Collectors.toList());

System.out.println(skippedList); // 输出: [date, fig, grape]

min和max

min和max方法
  用于查找流中的最小值和最大值
  例:
List<Integer> numbers = Arrays.asList(10, 20, 30, 40, 50);

// 查找最小值
Optional<Integer> min = numbers.stream()
   .min(Integer::compareTo);

System.out.println(min.get()); // 输出: 10

// 查找最大值
Optional<Integer> max = numbers.stream()
   .max(Integer::compareTo);

System.out.println(max.get()); // 输出: 50

findAny和findFirst

findAny和findFirst方法
  用于查找流中任意元素和第一个元素

List<String> list = Arrays.asList("java265.com", "java编程网站", "最爱的java语言");

// 查找任意一个元素
Optional<String> anyElement = list.stream().findAny();

System.out.println(anyElement.get());  

// 查找第一个元素
Optional<String> firstElement = list.stream().findFirst();

System.out.println(firstElement.get());  
版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。

本文链接: https://www.Java265.com/JavaJingYan/202501/17364918268205.html

最近发表

热门文章

好文推荐

Java265.com

https://www.java265.com

站长统计|粤ICP备14097017号-3

Powered By Java265.com信息维护小组

使用手机扫描二维码

关注我们看更多资讯

java爱好者