java8新特性-Stream

目录

一、Stream API的理解:

1.1 Stream关注

1.2 java8的api

二、简介

三、Stream实例化

四、中间操作

​五、终止操作

六、Stream的常用案例

1.steam将list集合转set集合

2.steam将list集合转map集合

3.steam计算求和

4.steam查找最值

5.stream过滤器

6.stream的match

7.stream实现排序

8.stream Limit和skip

9.组合案例

10.并行流

一、Stream API的理解:

1.1 Stream关注

是对数据的运算,与CPU打交道,集合关注的是数据的存储,与内存打交道

1.2 java8的api

使用这套api可以对内存中的数据进行过滤、排序、映射、归约等操作。类似于sql对数据库中表的相关操作。

二、简介

流(Stream)是 Java 8 引入的一种处理集合数据的抽象概念,它提供了一种更简洁、更灵活的方式来操作和处理集合数据。流可以看作是一系列元素的管道,可以对这些元素进行筛选、转换、排序、归约等操作,实现各种数据处理需求。与传统的循环迭代方式相比,流的代码更易读、更易于并行化处理,并且能够充分发挥多核处理器的优势。通过使用流,可以提高代码的可读性和可维护性,同时也能够更高效地处理大规模数据集合。

三、Stream实例化

    //创建 Stream方式一:通过集合@Testpublic void test1(){List<Employee> employees = EmployeeData.getEmployees();//        default Stream<E> stream() : 返回一个顺序流Stream<Employee> stream = employees.stream();//        default Stream<E> parallelStream() : 返回一个并行流Stream<Employee> parallelStream = employees.parallelStream();}//创建 Stream方式二:通过数组@Testpublic void test2(){int[] arr = new int[]{1,2,3,4,5,6};//调用Arrays类的static <T> Stream<T> stream(T[] array): 返回一个流IntStream stream = Arrays.stream(arr);Employee e1 = new Employee(1001,"Tom");Employee e2 = new Employee(1002,"Jerry");Employee[] arr1 = new Employee[]{e1,e2};Stream<Employee> stream1 = Arrays.stream(arr1);}//创建 Stream方式三:通过Stream的of()@Testpublic void test3(){Stream<Integer> stream = Stream.of(1, 2, 3, 4, 5, 6);}//创建 Stream方式四:创建无限流@Testpublic void test4(){//      迭代
//      public static<T> Stream<T> iterate(final T seed, final UnaryOperator<T> f)//遍历前10个偶数Stream.iterate(0, t -> t + 2).limit(10).forEach(System.out::println);//      生成
//      public static<T> Stream<T> generate(Supplier<T> s)Stream.generate(Math::random).limit(10).forEach(System.out::println);}

四、中间操作

 五、终止操作

Collector需要使用Collectors提供实例。 

六、Stream的常用案例

1.steam将list集合转set集合

public static void main(String [] args){List<Student> students=Arrays.asList(new Student("小明",18),new Student("小黑",16),new Student("小红",17));//转成流并进行set集合转换Set<Student> sets=students.stream().collect(Collectors.toSet());//集合遍历sets.forEach(stu->System.out.println(stu.toString()));}

在上面的示例中,我们首先创建了一个 List 集合 list,包含了三个对象。然后使用 stream 方法将其转换为流,接着使用 collect 方法将流中的元素收集到一个 Set 集合中,使用 Collectors.toSet() 指定要收集到的集合类型。最终得到了一个包含唯一元素的 Set 集合。

注意:转成set集合需要重写实体类Student的equals 方法和 hashCode 方法。

2.steam将list集合转map集合

在上面的示例中,我们首先创建了一个包含学生对象的 List<Student> 集合 students。然后使用 stream 方法将其转换为流,接着使用 collect 方法将流中的元素收集到一个 Map 集合中,使用 Collectors.toMap() 指定键和值的提取方式。在这里,我们使用学生对象的姓名作为键,学生对象本身作为值。

3.steam计算求和


public static void main(String[] args) {List<Student> students= Arrays.asList(new Student("小明",18),new Student("小黑",16),new Student("小红",17));//创建流并累加年龄int sum=students.stream().mapToInt(Student::getAge).sum();System.out.println(sum);}

4.steam查找最值

public static void main(String[] args) {List<Student> students= Arrays.asList(new Student("小明",18),new Student("小黑",16),new Student("小红",17));//找出年龄最大的人Optional<Student> max=students.stream().max((o1, o2)->o1.getAge()-o2.getAge());System.out.println(max);//找出年龄最小的人Optional<Student> min=students.stream().min((o1, o2)->o1.getAge()-o2.getAge());System.out.println(min);
}

5.stream过滤器

filter 方法接受一个 Predicate 参数,该参数是一个函数式接口,用于指定过滤条件。filter 方法会根据条件筛选出流中符合条件的元素,并返回一个新的流。

 public static void main(String[] args) {List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);// 过滤并打印出所有偶数Stream<Integer> evenNumbers = numbers.stream().filter(n -> n % 2 == 0);evenNumbers.forEach(System.out::println);
}

6.stream的match

match 方法用于判断流中的元素是否符合指定的条件,并返回一个布尔值。

match 方法有三个变种:

  1. allMatch 方法:判断流中的所有元素是否都符合指定的条件,如果都符合,返回 true,否则返回 false。
  2. anyMatch 方法:判断流中是否存在任意一个元素符合指定的条件,如果有,返回 true,否则返回 false。
  3. noneMatch 方法:判断流中是否不存在任何一个元素符合指定的条件,如果没有,返回 true,否则返回 false。
public static void main(String[] args) {List<Student> students= Arrays.asList(new Student("小明",18),new Student("小黑",16),new Student("小红",17));// 判断所有学生年龄是否都大于17boolean match = students.stream().allMatch(s -> s.getAge() > 17);System.out.println(match);//false//判断只要有一个学生年龄小于17boolean match1 = students.stream().anyMatch(s -> s.getAge() < 17);System.out.println(match1);//true//判断没有一个学生年龄大于18boolean match2 = students.stream().noneMatch(s -> s.getAge() > 18);System.out.println(match2);//true
}

7.stream实现排序

public static void main(String[] args) {// 创建一个包含整数的StreamStream<Integer> stream1 = Stream.of(3, 1, 4, 1, 5, 9);Stream<Integer> stream2 = Stream.of(3, 1, 4, 1, 5, 9);// 使用sorted()方法对Stream1进行升序排序(默认)Stream<Integer> sortedStream = stream1.sorted();sortedStream.forEach(System.out::println);System.out.println("-----------------------------------------------");// 使用sorted()方法对Stream2进行降序排序Stream<Integer> sortedDescStream = stream2.sorted((a, b) -> b.compareTo(a));sortedDescStream.forEach(System.out::println);
} 

8.stream Limit和skip

Stream 类提供了 limit 和 skip 方法,用于限制流中元素的数量。

1.limit 方法:该方法用于截取流中的前 n 个元素,并返回一个新的流。如果流中的元素不足 n 个,则返回包含所有元素的流。

public static void main(String[] args) {List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);// 获取前3个元素Stream<Integer> limitedStream = numbers.stream().limit(3);limitedStream.forEach(System.out::println);
}

2.skip 方法:该方法用于跳过流中的前 n 个元素,并返回一个新的流。如果流中的元素不足 n 个,则返回一个空的流。

 public static void main(String[] args) {List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);//跳过前两个元素Stream<Integer> skipStream = numbers.stream().skip(2);skipStream.forEach(System.out::println);}

一般我们会通过limit方法和skip搭配进行分页截取

public static void main(String[] args) {List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5,6,7,8,9,10);//一页五个截取第二页Stream<Integer> skipLimitStream = numbers.stream().skip(5).limit(5);skipLimitStream.forEach(System.out::println);
}

9.组合案例

我们来看一个需求

对给定的学生列表按照年龄降序排列并查找姓张的,获取前3位

public static void main(String[] args) {List<Student> students= Arrays.asList(new Student("张明",18),new Student("李黑",16),new Student("王红",17),new Student("张三",36),new Student("李四",27),new Student("刘备",56),new Student("关羽",47),new Student("张飞",49),new Student("张同",17),new Student("张良",41));//降序排序--查找姓张的--截取前三位students.stream().sorted((s1,s2)->s2.getAge()-s1.getAge()).filter(s->s.getName().startsWith("张")).limit(3).forEach(System.out::println);System.out.println("-----------------------------------------------");
}

通过对流进行一系列的中间操作就可以完成这个需求,这种链式调用可以使代码非常简洁。

10.并行流

Stream 类提供了并行流的支持,可以通过 parallel 方法将一个顺序流转换为并行流。并行流可以充分利用多核处理器的优势,将流中的元素进行并发处理,从而提高处理效率。

前面所有流的示例都是顺序流(单线程),有时在面对较大的数据处理单线程效率太慢,我们就可以使用并行流(多线程)进行优化。

来看一个需求,求1-1亿的累加和,分别用单线程的顺序流跟多线程的并行流来看执行效率。

public static void main(String[] args) {// 顺序流计算long start = System.currentTimeMillis();int sum = IntStream.rangeClosed(1, 1000000000).sum();long end = System.currentTimeMillis();System.out.println("顺序流计算结果:" + sum + ",耗时:" + (end - start) + " 毫秒");// 并行流计算start = System.currentTimeMillis();sum = IntStream.rangeClosed(1, 1000000000).parallel().sum();end = System.currentTimeMillis();System.out.println("并行流计算结果:" + sum + ",耗时:" + (end - start) + " 毫秒");
}

 可以看到执行效率还是有明显提升的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/488426.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

色彩搭配:打造视觉吸引力与用户体验的关键

title: 色彩搭配&#xff1a;打造视觉吸引力与用户体验的关键 date: 2024/2/22 12:01:11 updated: 2024/2/22 12:01:11 tags: 网站色彩搭配视觉吸引力品牌形象用户体验设计色彩心理学配色技巧色轮互补 在当今数字化时代&#xff0c;网站已经成为了人们获取信息、进行交流和进行…

【黑马程序员】走进STL

文章目录 STL初始STL诞生STL基本概念STL六大组件STL中容器、算法、迭代器容器算法迭代器 vectorvector存放内置数据类型代码示例运行结果 vector存放自定义数据类型代码示例运行结果 vector容器嵌套vector容器代码示例运行结果 STL初始 STL诞生 长久以来&#xff0c;软件界一…

07 STL 简介

目录 什么是STLSTL的版本STL的六大组件STL的重要性如何学习STLSTL的缺陷 1. 什么是STL c标准库的重要组成部分&#xff0c;不仅是一个可复用的组件库&#xff0c;而且是一个包罗数据结构和算法的软件框架 2. STL的版本 原始版本 Alexander Stepanov、Meng Lee在惠普实验室的…

Ubuntu20.04 查看系统版本号

目录 uname -auname -vlsb_release -acat /etc/issuecat /proc/version uname -a 查看系统发行版本号和操作系统版本 uname -v 查看版本号 lsb_release -a 查看发行版本信息 cat /etc/issue 查看系统版本 cat /proc/version 查看内核的版本号

Linux系统——Nginx服务状态码总结

目录 一、1xx状态码 100 Continue 101 Switch Protocols 102 Processing 二、2xx状态码 200 OK 201 Created 202 Accepted 203 Non-Authoritative Information 204 No Content 205 Reset Content 206 Partial Content 207 Multi-Status 208 Already Reported 三…

泰山众筹:掀起一场全民参与的购物狂潮!

随着互联网的快速发展&#xff0c;传统的商业模式已经无法满足消费者的多元化需求。在这个数字化时代&#xff0c;泰山众筹模式以其独特的魅力&#xff0c;正迅速成为新零售市场的热门话题。它不仅为消费者带来了前所未有的购物体验&#xff0c;还为企业的发展注入了新的活力。…

高考杂志高考杂志社高考编辑部2023年第32期目录

高考论坛 高中数学课堂教学中创设有效情境的策略探究 黄进生; 3-5 核心素养为导向的高中物理教学探究 王丽萍; 6-8 高中化学“教、学、评”一体化教学模式的有效应用 陈燕; 9-11《高考》投稿&#xff1a;cn7kantougao163.com 新高考背景下高中英语阅读理解教学…

Offer必备算法08_二叉树dfs_六道力扣题详解(由易到难)

目录 ①力扣2331. 计算布尔二叉树的值 解析代码 ②力扣129. 求根节点到叶节点数字之和 解析代码 ③力扣814. 二叉树剪枝 解析代码 ④​​​力扣98. 验证二叉搜索树 解析代码 ⑤力扣230. 二叉搜索树中第K小的元素 解析代码 ⑥力扣257. 二叉树的所有路径 解析代码 ①…

上班族steam游戏搬砖:月薪3k,副业破万

主业是为了生存&#xff0c;副业才是更好的发展。上班族选一个合适的副业&#xff0c;不仅能让生活过得更好&#xff0c;更能增加自己的抗风险能力。steam游戏搬砖项目就是一个比较好的&#xff0c;适合上班族的副业&#xff0c;它时间灵活且变现方便&#xff0c;可以当一个长期…

Apache celeborn 安装及使用教程

1.下载安装包 https://celeborn.apache.org/download/ 测0.4.0时出现https://github.com/apache/incubator-celeborn/issues/835 2.解压 tar -xzvf apache-celeborn-0.3.2-incubating-bin.tgz 3.修改配置文件 cp celeborn-env.sh.template celeborn-env.shcp log4j2.xml.…

程序媛的mac修炼手册-- 小白入门Java篇

最近因为要用CiteSpace做文献综述&#xff0c;间接接触Java了。所以&#xff0c;继Python、C之后&#xff0c;又要涉猎Java了。刺激&#xff01;&#xff01; 由于CiteSpace与Java要求版本高度匹配&#xff0c;有个匹配详情明天为大家讲解。总之&#xff0c;我的Java之旅开始于…

在openEuler中通过KVM可视化安装华为FusionCompute的VRM节点

一、说明 本文是华为FusionCompute云平台配置的延续&#xff0c;是在CNA&#xff08;ComputingNode Agent&#xff0c;计算节点代理&#xff09;主机安装配置完成后&#xff0c;详细安装VRM&#xff08;Virtual Resource Manager&#xff0c;虚拟资源管理器&#xff09;节点的…