Stream流中各阶段方法说明及组合示例

news/2024/11/24 10:50:42/

文章目录

  • 常用方法
    • Stream方法组合使用
      • 第一种介绍字符串集合可进行的操作
      • 第二种介绍int类型集合可进行的操作
      • 第三种介绍collect()和filter()组合的使用方式
      • 方法对比flatMap()和filter()
  • Stream的创建
    • 1. 从集合或数组创建
    • 2. 使用Stream.of()创建
    • 3. 使用Stream.iterate()创建
    • 4. 使用Stream.generate()创建
  • Stream的中间操作
    • 1. filter
    • 2. map
    • 3. flatMap
    • 4. distinct
    • 5. sorted
    • 6. peek
    • 7. limit
    • 8. skip
    • 9. parallel
    • 10. sequential
  • Stream的终止操作
    • 1. forEach
    • 2. toArray
    • 3. reduce
    • 4. collect
    • 5. count
    • 6. anyMatch
    • 7. allMatch
    • 8. noneMatch
    • 9. findAny
    • 10. findFirst

常用方法

Stream方法组合使用

第一种介绍字符串集合可进行的操作

import java.util.Arrays;
import java.util.List;public class StreamExample {public static void main(String[] args) {List<String> list = Arrays.asList("apple", "banana", "cat", "dog", "egg");long count = list.stream()                  // 创建Stream.filter(s -> s.length() == 3) // 过滤长度为3的元素.map(String::toUpperCase)     // 转换为大写.sorted()                     // 排序.count();                     // 统计元素个数System.out.println(count); // 输出:3}
}

上述代码中,首先创建了一个包含5个字符串的List,然后通过stream()方法将其转换为一个Stream。接着对Stream进行操作,包括过滤、转换为大写、排序和统计元素个数。最后将统计结果打印出来。
具体步骤和注释如下:

  • list.stream(): 将List转换为一个Stream对象。
  • filter(s -> s.length() == 3): 对Stream中的元素进行过滤,只保留长度为3的元素。
  • map(String::toUpperCase): 将Stream中的元素转换为大写。
  • sorted(): 对Stream中的元素进行排序。
  • count(): 统计Stream中元素的个数。
  • System.out.println(count): 将统计结果打印出来。

第二种介绍int类型集合可进行的操作

下面的代码演示了如何使用Stream的方法组合来完成以下三个操作:

找出所有大于5的偶数,并将结果存储到一个列表中;
计算列表中所有元素的平方和;
找出列表中的最大值和最小值。

import java.util.Arrays;
import java.util.List;public class StreamDemo {public static void main(String[] args) {// 创建一个包含整数的列表List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);// 找出所有大于5的偶数,并将结果存储到一个列表中List<Integer> result = numbers.stream().filter(n -> n > 5)          // 过滤出大于5的数.filter(n -> n % 2 == 0)    // 过滤出偶数.collect(Collectors.toList()); // 将结果存储到一个列表中System.out.println(result);// 计算列表中所有元素的平方和int sum = numbers.stream().mapToInt(n -> n * n)        // 将元素映射为它的平方.sum();                     // 计算和System.out.println(sum);// 找出列表中的最大值和最小值IntSummaryStatistics stats = numbers.stream().mapToInt((x) -> x)          // 将Stream<Integer>转换为IntStream.summaryStatistics();       // 计算统计信息System.out.println("最大值: " + stats.getMax());System.out.println("最小值: " + stats.getMin());}
}

下面分别对这三个操作进行详细的解释:

操作1:找出所有大于5的偶数,并将结果存储到一个列表中

首先,使用filter()方法过滤出大于5的数,然后使用另一个filter()方法过滤出偶数,最后使用collect()方法将结果存储到一个列表中。

操作2:计算列表中所有元素的平方和

首先,使用mapToInt()方法将每个元素映射为它的平方,然后使用sum()方法计算和。

操作3:找出列表中的最大值和最小值

首先,使用mapToInt()方法将Stream转换为IntStream,然后使用summaryStatistics()方法计算统计信息,包括最大值和最小值。

第三种介绍collect()和filter()组合的使用方式

在下面的代码中,首先创建了一个包含数字1到10的List。然后,调用stream()方法将List转换为一个Stream。接着,调用filter()方法对Stream中的元素进行过滤操作,只保留偶数元素。最后,调用collect()方法将结果收集到一个新的List中。

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;public class StreamDemo {public static void main(String[] args) {List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);List<Integer> result = numbers.stream().filter(number -> number % 2 == 0).collect(Collectors.toList());System.out.println(result);}
}

将一个包含学生信息的List转换为一个以学生名字为键,学生对象为值的Map。
在下面的代码中,首先创建了一个包含三个学生信息的List。然后,调用stream()方法将List转换为一个Stream。接着,调用collect()方法,并传递一个Collectors.toMap()方法作为参数。在toMap()方法中,使用Student::getName将学生名字作为Map的键,使用student -> student将学生对象作为Map的值。最终,将结果存储到一个Map对象中。

import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

public class StreamDemo {public static void main(String[] args) {List<Student> students = Arrays.asList(new Student("Tom", 18),new Student("Jack", 20),new Student("Lucy", 19));Map<String, Student> result = students.stream().collect(Collectors.toMap(Student::getName, student -> student));System.out.println(result);}
}class Student {private String name;private int age;public Student(String name, int age) {this.name = name;this.age = age;}public String getName() {return name;}public int getAge() {return age;}@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", age=" + age +'}';}
}

方法对比flatMap()和filter()

这两个方法都可以用来筛选流中的数据,但它们的实现方式和作用是不同的。
flatMap()方法的作用是将一个Stream中的每个元素都转换为一个新的流,然后将这些流合并成一个新的流。换句话说,flatMap()方法用来处理嵌套的流结构,并将它们扁平化为一个单一的流。因此,flatMap()方法常用于将嵌套的集合或数组展开为一个单独的流,以方便进一步的处理。
下面是一个使用flatMap()方法的示例代码:

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

在上面的代码中,首先创建了一个包含多个集合的列表numbers。然后,调用stream()方法将这个列表转换为一个Stream。接着,使用flatMap()方法将每个集合都转换为一个新的流,并将这些流合并为一个新的流。最后,使用collect()方法将所有的元素收集到一个新的List中。
filter()方法的作用是根据指定的条件筛选出符合条件的元素,并将它们收集到一个新的Stream中。换句话说,filter()方法用于对Stream中的元素进行条件过滤。因此,filter()方法常用于从一个大的数据集合中,选择符合条件的元素,以用于进一步的处理。
下面是一个使用filter()方法的示例代码:

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6);
List<Integer> evenNumbers = numbers.stream().filter(n -> n % 2 == 0).collect(Collectors.toList());
System.out.println(evenNumbers);
// Output: [2, 4, 6]

在上面的代码中,首先创建了一个包含多个整数的列表numbers。然后,调用stream()方法将这个列表转换为一个Stream。接着,使用filter()方法过滤出所有偶数,并将它们收集到一个新的Stream中。最后,使用collect()方法将所有偶数收集到一个新的List中。
需要注意的是,flatMap()和filter()方法都是用于处理Stream中的数据,并返回一个新的Stream,它们常常被用于组合使用,以达到对数据进行更复杂处理的目的。

Stream的创建

可以通过以下方式创建Stream:

1. 从集合或数组创建

可以通过Collection.stream()或Arrays.stream()方法来创建Stream。

List<String> list = Arrays.asList("a", "b", "c"); 
Stream<String> stream = list.stream();

2. 使用Stream.of()创建

使用Stream.of()方法创建一个Stream。

Stream<String> stream = Stream.of("a", "b", "c");

3. 使用Stream.iterate()创建

使用Stream.iterate()方法创建一个无限流。

Stream<Integer> stream = Stream.iterate(0, n -> n + 2);

4. 使用Stream.generate()创建

使用Stream.generate()方法创建一个无限流。

Stream<Double> stream = Stream.generate(Math::random);

Stream的中间操作

中间操作是指对数据源进行处理并返回一个Stream对象的操作,可以对数据源进行筛选、映射、去重、排序等操作。

以下是常用的Stream中间操作:

1. filter

该方法用于通过设置的条件过滤出元素,返回一个新的Stream对象。

Stream<String> stream = Stream.of("apple", "banana", "orange", "pear"); 
stream.filter(s -> s.length() > 5).forEach(System.out::println);

2. map

该方法用于将元素按照某种规则进行转换,返回一个新的Stream对象。

Stream<String> stream = Stream.of("apple", "banana", "orange", "pear"); 
stream.map(String::toUpperCase).forEach(System.out::println);

3. flatMap

该方法用于将一个Stream中的每个元素转换为另一个Stream,然后将所有Stream中的元素合并成一个Stream,返回一个新的Stream对象。
具体来说,flatMap()方法接收一个函数作为参数,这个函数将一个元素转换为一个新的流。然后,flatMap()方法将所有这些新的流合并成一个新的流,最后返回这个新的流。如果这个函数返回的是一个空的流,那么这个流中就不会包含任何元素。

Stream<List<Integer>> stream = Stream.of(Arrays.asList(1, 2), Arrays.asList(3, 4)); 
stream.flatMap(Collection::stream).forEach(System.out::println);

4. distinct

该方法用于对Stream中的元素进行去重,返回一个新的Stream对象。

Stream<String> stream = Stream.of("apple", "banana", "orange", "apple"); 
stream.distinct().forEach(System.out::println);

5. sorted

该方法用于对Stream中的元素进行排序,返回一个新的Stream对象。

Stream<String> stream = Stream.of("apple", "banana", "orange", "pear"); 
stream.sorted().forEach(System.out::println);

6. peek

该方法用于在执行Stream中的下一个操作时对元素进行操作,返回一个新的Stream对象。

Stream<String> stream = Stream.of("apple", "banana", "orange", "pear"); 
stream.peek(s -> System.out.println("before filter: " + s)).filter(s -> s.length() > 5) .peek(s -> System.out.println("after filter: " + s)).forEach(System.out::println);

7. limit

该方法用于截取Stream中前n个元素,返回一个新的Stream对象。

Stream<String> stream = Stream.of("apple", "banana", "orange", "pear"); 
stream.limit(2).forEach(System.out::println);

8. skip

该方法用于跳过Stream中前n个元素,返回一个新的Stream对象。

Stream<String> stream = Stream.of("apple", "banana", "orange", "pear"); 
stream.skip(2).forEach(System.out::println);

9. parallel

该方法用于将Stream转换为并行流,返回一个新的Stream对象。

Stream<String> stream = Stream.of("apple", "banana", "orange", "pear"); 
stream.parallel().forEach(System.out::println);

10. sequential

该方法用于将Stream转换为串行流,返回一个新的Stream对象。

Stream<String> stream = Stream.of("apple", "banana", "orange", "pear"); 
stream.parallel().sequential().forEach(System.out::println);

Stream的终止操作

终止操作是指对Stream进行最终操作,产生一个结果或副作用,但不再返回Stream对象。

以下是常用的Stream终止操作:

1. forEach

该方法用于对Stream中的元素进行遍历操作。

Stream<String> stream = Stream.of("apple", "banana", "orange", "pear"); 
stream.forEach(System.out::println);

2. toArray

该方法用于将Stream中的元素转换为数组。

Stream<String> stream = Stream.of("apple", "banana", "orange", "pear");String[] strArr = stream.toArray(String[]::new);

3. reduce

该方法用于将Stream中的所有元素按照指定的规则进行归约操作,返回一个Optional对象。

Stream<Integer> stream = Stream.of(1, 2, 3, 4); Optional<Integer> result = stream.reduce((x, y) -> x + y); 
result.ifPresent(System.out::println);

4. collect

该方法用于将Stream中的元素收集到一个集合中,返回一个新的集合对象。

Stream<String> stream = Stream.of("apple", "banana", "orange", "pear"); List<String> list = stream.collect(Collectors.toList());

5. count

该方法用于计算Stream中的元素个数,返回一个long类型的值。

Stream<String> stream = Stream.of("apple", "banana", "orange", "pear");
long count = stream.count();
System.out.println(count);

6. anyMatch

该方法用于判断Stream中是否存在满足指定条件的元素,返回一个boolean类型的值。

Stream<Integer> stream = Stream.of(1, 2, 3, 4); boolean result = stream.anyMatch(x -> x > 2); 
System.out.println(result);

7. allMatch

该方法用于判断Stream中的所有元素是否都满足指定条件,返回一个boolean类型的值。

Stream<Integer> stream = Stream.of(1, 2, 3, 4); boolean result = stream.allMatch(x -> x > 0); 
System.out.println(result);

8. noneMatch

该方法用于判断Stream中的所有元素是否都不满足指定条件,返回一个boolean类型的值。

Stream<Integer> stream = Stream.of(1, 2, 3, 4); boolean result = stream.noneMatch(x -> x > 5); 
System.out.println(result);

9. findAny

该方法用于获取Stream中的任意一个元素,返回一个Optional对象。

Stream<Integer> stream = Stream.of(1, 2, 3, 4); Optional<Integer> result = stream.findAny(); 
result.ifPresent(System.out::println);

10. findFirst

该方法用于获取Stream中的第一个元素,返回一个Optional对象。

​​

Stream<Integer> stream = Stream.of(1, 2, 3, 4); Optional<Integer> result = stream.findFirst(); 
result.ifPresent(System.out::println);


http://www.ppmy.cn/news/57168.html

相关文章

Go语言——【高质量编程 | 代码规范】

作者&#xff1a;非妃是公主 专栏&#xff1a;《Golang》 博客主页&#xff1a;https://blog.csdn.net/myf_666 个性签&#xff1a;顺境不惰&#xff0c;逆境不馁&#xff0c;以心制境&#xff0c;万事可成。——曾国藩 文章目录 一、高质量编程定义 二、代码规范1. 代码格式…

五、C++内存管理机制 —— primitives(侯捷)

侯捷 C八部曲笔记汇总 - - - 持续更新 ! ! ! 一、C 面向对象高级开发 1、C面向对象高级编程(上) 2、C面向对象高级编程(下) 二、STL 标准库和泛型编程 1、分配器、序列式容器 2、关联式容器 3、迭代器、 算法、仿函数 4、适配器、补充 三、C 设计模式 四、C 新标准 五、C 内存管…

【初学人工智能原理】【2】方差代价函数:知错

前言 本文教程均来自b站【小白也能听懂的人工智能原理】&#xff0c;感兴趣的可自行到b站观看。 本文【原文】章节来自课程的对白&#xff0c;由于缺少图片可能无法理解&#xff0c;故放到了最后&#xff0c;建议直接看代码&#xff08;代码放到了前面&#xff09;。 代码实…

unity GI Shader 实现

之前分享了一篇对unity全局光照的解析&#xff0c;里面提到了一些东西&#xff0c;需要在Shader内实现&#xff0c;在这一篇补上。 要实现对全局GI的shader实现&#xff0c;我们可以通过对unity内置的Lit进行解析查看。 烘焙的方式有很多种&#xff0c;选择合适的方式烘焙和使…

Android Jetpack 从使用到源码深耕【LiveData 从实践到原理 】(二)

上文,我们就一个实例需求,引入了LiveData进行了实现,大家通过前后的编码实现方案对比,可以感受到LiveData的好用。不由的为jetpack组件的开发者点赞。 Android Jetpack 从使用到源码深耕【LiveData 从实践到原理 】(一) Android Jetpack 从使用到源码深耕【LiveData 从实…

【热门框架】Maven中聚合,继承指的是什么?有什么作用?

Maven中的聚合和继承是两个重要的功能&#xff0c;用于管理多个项目的共同部分。 1. 聚合 Maven中的聚合&#xff08;Aggregation&#xff09;指的是将多个子项目聚合成一个父项目的过程。聚合的语法如下&#xff1a; xml <project> <modelVersion>4.0.0<…

2022年职业教育技能大赛网络安全 linux系统渗透提权

B-10&#xff1a;Linux 系统渗透提权 任务环境说明&#xff1a; ✓ 服务器场景&#xff1a;Server2202&#xff08;关闭链接&#xff09; ✓ 用户名&#xff1a;hacker 密码&#xff1a;123456 使用渗透机对服务器信息收集&#xff0c;并将服务器中 SSH 服务端口号作为 flag…