【JAVA进阶】Stream流

news/2024/12/21 19:03:59/

📃个人主页:个人主页

🔥系列专栏:JAVASE基础

目录

1.Stream流的概述

2.Stream流的获取

3.Stream流的常用方法


 

1.Stream流的概述

什么是Stream流?

  • 在Java 8中,得益于Lambda所带来的函数式编程, 引入了一个全新的Stream流概念。
  • 目的:用于简化集合和数组操作的API。

 Stream流思想

Stream流式思想的核心:

  1. 先得到集合或者数组的Stream流(就是一根传送带)
  2. 把元素放上去
  3. 然后就用这个Stream流简化的API来方便的操作元素。

体验Stream流的作用

假设我们有一个Person类,其中包含属性name和age。我们有一个List<Person>对象,现在我们要使用Java Stream流来过滤出其中年龄大于18岁的人的名字。

public class Main {public static void main(String[] args) {List<Person> people = new ArrayList<>();people.add(new Person("Mike", 20));people.add(new Person("John", 17));people.add(new Person("Lucy", 25));people.stream().filter(p -> p.getAge() > 18).forEach((s-> System.out.println(s.getName())));}
}

输出:

Mike
Lucy

2.Stream流的获取

Stream操作集合或者数组的第一步是先得到Stream流,然后才能使用流的功能。

集合获取Stream流的方式

可以使用Collection接口中的默认方法stream​()生成流

名称

说明

default Stream<E> stream​()

获取当前集合对象的Stream流

 

public class Main {public static void main(String[] args) {//----------------- Collection集合获取流------------------------Collection<String> list = new ArrayList<>();Stream<String> stream = list.stream();
//----------------- Map集合获取流------------------------HashMap<String,Integer> map = new HashMap<>();//键流Stream<String> keyStream = map.keySet().stream();//值流Stream<Integer> valueStream = map.values().stream();//键值对流(拿整体)Stream<Map.Entry<String, Integer>> entryStream = map.entrySet().stream();}
}

数组获取Stream流的方式

名称

说明

public static <T> Stream<T> stream(T[] array)

获取当前数组的Stream流

public static<T> Stream<T> of(T... values) 

获取当前数组/可变数据的Stream流

 

    public static void main(String[] args) {String[] names=["热爱","编程的","小白白"];Stream<String> stream = Arrays.stream(names);Stream<String> stringStream = Stream.of(names);}

Stream流有三类方法:

  1. Intermediate(中间操作):对数据进行处理和转换,返回一个新的Stream对象,可以链式操作。包括常用的map、filter、distinct等方法。

  2. Terminal(终止操作):对Stream流进行聚合或收集操作,触发执行计算并返回结果。包括常用的forEach、reduce、collect等方法。

  3. Short-circuiting(短路操作):在满足一定条件时可以提前结束Stream流的操作。包括常用的anyMatch、allMatch、noneMatch等方法。

3.Stream流的常用方法

collect():将流中的元素收集到一个容器中。

List<String> words = Arrays.asList("hello", "world", "java", "stream", "api");
Set<String> wordSet = words.stream().collect(Collectors.toSet());
System.out.println(wordSet);

上述代码中,我们定义了一个包含字符串的List,使用Stream的collect()方法对其进行收集操作,将其结果保存在Set集合中,去除重复元素,最终将结果保存在wordSet的Set集合中,并打印输出。

Stream流的常用API中间操作方法包括:

1.filter():根据指定的条件过滤元素。

List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6);
List<Integer> result = list.stream().filter(num -> num % 2 == 0).collect(Collectors.toList());
System.out.println(result);

上述代码中,我们定义了一个包含整数的List,并使用Stream的filter()方法对其进行过滤,只保留其中的偶数,最终将结果保存在result的List中,并打印输出。

 

2.distinct():根据元素的 hashCode() 和 equals() 方法去重。

List<String> words = Arrays.asList("hello", "world", "hello", "java", "world");
List<String> uniqueWords = words.stream().distinct().collect(Collectors.toList());
System.out.println(uniqueWords);

上述代码中,我们定义了一个包含字符串的List,使用Stream的distinct()方法对其进行去重操作,最终将结果保存在uniqueWords的List中,并打印输出。

3.limit():限制元素数量。

List<String> words = Arrays.asList("hello", "world", "java", "stream", "api");
List<String> limitedWords = words.stream().limit(3).collect(Collectors.toList());
System.out.println(limitedWords);

上述代码中,我们定义了一个包含字符串的List,使用Stream的limit()方法对其进行限制操作,只保留前3个元素,最终将结果保存在limitedWords的List中,并打印输出。

4.skip():跳过指定数量的元素。

List<String> words = Arrays.asList("hello", "world", "java", "stream", "api");
List<String> skippedWords = words.stream().skip(2).collect(Collectors.toList());
System.out.println(skippedWords);

上述代码中,我们定义了一个包含字符串的List,使用Stream的skip()方法对其进行跳过操作,跳过前2个元素,只保留后面的元素,最终将结果保存在skippedWords的List中,并打印输出。


5.concat():合并a和b两个流为一个流

Stream<String> stream1 = Stream.of("Java", "is", "cool");
Stream<String> stream2 = Stream.of(" and", "fun", "too!");Stream<String> resultStream = Stream.concat(stream1, stream2);
resultStream.forEach(System.out::print); // Output: Java is cool and fun too!

在这个例子中,我们首先创建两个字符串流 stream1 和 stream2,并使用 concat() 方法将它们连接在一起,形成一个新的流 resultStream。最后,我们遍历新的流,并将结果输出到控制台。

总之,Stream.concat() 方法可以将两个流连接为一个流,以便进行进一步的操作。

注意:

  • 中间方法也称为非终结方法,调用完成后返回新的Stream流可以继续使用,支持链式编程。
  • 在Stream流中无法直接修改集合、数组中的数据。

Stream流的常见终结操作方法:

1.forEach()  对此流的每个元素执行遍历操作

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
numbers.stream().forEach(n -> System.out.println(n));

2.count()  返回此流中的元素数  

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
long count = numbers.stream().count();
System.out.println("Count: " + count);

注意:终结操作方法,调用完成后流就无法继续使用了,原因是不会返回Stream了。

收集Stream流:

收集Stream流的含义:就是把Stream流操作后的结果数据转回到集合或者数组中去。

  • Stream流:方便操作集合/数组的手段。
  • 集合/数组:才是开发中的目的。

Stream流的收集方法:

名称

说明

R collect​(Collector collector)

开始收集Stream流,指定收集器

 Collectors工具类提供了具体的收集方式:

名称

说明

public static <T> Collector toList​()

把元素收集到List集合中

public static <T> Collector toSet​()

把元素收集到Set集合中

public static  Collector toMap​(Function keyMapper , Function valueMapper)

把元素收集到Map集合中

 上面案例有使用过,所以就不举例子了....


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

相关文章

Java内部类(成员内部类、局部内部类、静态内部类、匿名内部类)

目录 ①. 什么是内部类 ②. 内部类的共性 ③. 为什么需要内部类 ④. 成员内部类 ⑤. 局部内部类 ⑥. 静态内部类&#xff08;嵌套类&#xff09; ⑦. 匿名内部类 ①. 什么是内部类 内部类是指在一个外部类的内部再定义一个类。内部类作为外部类的一个成员&#xff0c;并…

【IP转换】

ip转换 //点分十进制转换成大端 #include <arpa/inet.h> int inet_pton(int af, const char *src, void *dst); 功能: 将点分十进制串 转成32位网络大端的数据("192.168.1.2" > ) 参数: af : AF_INET IPV4 AF_INET6 IPV6 src: 点分十…

STP 生成树协议

STP&#xff08;Spanning-Tree Protocol&#xff09;的来源 在网络三层架构中&#xff0c;我们会使用冗余这一技术&#xff0c;也就是对三层架构中的这些东西进行备份。冗余包含了设备冗余、网关冗余、线路冗余、电源冗余。 在二层交换网络中进行线路冗余&#xff0c;如图&am…

## 如何顺序处理设备上报的数据

1. 引言 随着智能技术的发展&#xff0c;市场上出现了很多的智能设备&#xff0c;其具有连接网络的能力。用户可以实现远程控制&#xff0c;并且设备也可上报自己的状态&#xff0c;实现云端对设备的运行情况分析。在某些情况下需要保证设备上报状态的有序性&#xff0c;例如传…

CSS布局:浮动与绝对定位的异同点

CSS布局&#xff1a;浮动与绝对定位的异同点_cherry_vincent的博客-CSDN博客 浮动 ( float ) 和绝对定位 ( position:absolute ) 相同点&#xff1a; &#xff08;1&#xff09;都是漂起来( 离开原来的位置 ) &#xff08;2&#xff09;并且都不占着原来的位置 &#xff08;3…

抖音账号矩阵系统源码开发之——视频发布功能开发

视频发布权限在账号矩阵系统研发之初&#xff0c;都是一个备受争议的功能&#xff0c;最早之前我们使用的视频发布权限名字是Video.creat, video.delete权限&#xff0c;但是该权限于2022年10月份做了权限的收回&#xff0c;后又在上架了一个能力叫发布内容至抖音&#xff1a;…

高级第一个月考试题

1.什么是Vue框架&#xff1f; Vue是一套用于构建用户界面的渐进式框架。与其它大型框架不同的是&#xff0c;Vue 被设计为可以自底向上逐层应用。Vue 的核心库只关注视图层&#xff0c;并且还便于与第三方库或既有项目整合。另一方面&#xff0c;当与现代化的工具链以及各种支持…

Android 12.0 手动安装Persistent app失败的解决方案

1.概述 在12.0的系统产品开发中,对于一些安装app的失败问题,需要看日志 和抛出异常来判断问题所在,在最近的一些app安装失败抛出了关于Presistent app安装失败的问题,就需要从PMS安装的过程中看异常抛出的原因解决问题所在 2.手动安装Persistent app失败的解决方案的核心类…