Java8新特性 - Stream流的应用
生命不息,写作不止 继续踏上学习之路,学之分享笔记 总有一天我也能像各位大佬一样 一个有梦有戏的人 @怒放吧德德分享学习心得,欢迎指正,大家一起学习成长!
文章插图
简介stream是java8新出的抽象概念,他可以让你根据你期望的方式来处理集合数据,能够轻松的执行复杂的查找、过滤和映射数据等操作 。Stream 使用一种类似用 SQL 语句从数据库查询数据的直观方式来提供一种对 Java 集合运算和表达的高阶抽象 。Stream API可以极大提高Java程序员的生产力 , 让程序员写出高效率、干净、简洁的代码 。这种风格将要处理的元素集合看作一种流 , 流在管道中传输,并且可以在管道的节点上进行处理 , 比如筛?。?排序,聚合等 。元素流在管道中经过中间操作(intermediate operation)的处理,最后由最终操作(terminal operation)得到前面处理的结果 。对于一个集合,首先需要转成stream流,可以使用中间操作(filter过滤器、distinct去重、sorted排序等),但是最后是由终止操作结束(forEach遍历、collect转换、min,max最小最大等) 。
Stream流的使用生成流在 Java 8 中, 集合接口有两个方法来生成流:
- stream() ? 为集合创建串行流,也就是采用单线程执行
- parallelStream() ? 为集合创建并行流,也就是采用多线程执行串行流:单线程的方式操作,数据量比较少的时候使用并行流:多线程方式操作,数据量比较大的时候使用主要原理是:将一个大的任务拆分n多个小的子任务并行执行,最后在统计结果,有可能会非常消耗cpu的资源,确实可以提高效率,但是在数据量不多的时候就不要使用并行流 。
【【Java8新特性】- Stream流】
package com.jdk8.demo.lambda.entity;import java.util.HashMap;/** * @author: lyd * @description: 实体 * @Date: 2022/10/5 */public class Student {private String name;private Integer score;// ... 省略get、set、构造方法@Overridepublic boolean equals(Object obj) {if (obj instanceof Student) {return name.equals(((Student) obj).name) && score == ((Student) obj).score;}return false;}@Overridepublic int hashCode() {return score.hashCode();}}
测试代码public static void main(String[] args) {// Stream将list转换为SetArrayList<Student> students = new ArrayList<>();students.add(new Student("lyd", 99));students.add(new Student("lkj", 55));students.add(new Student("llm", 67));students.add(new Student("lss", 87));students.add(new Student("lss", 87));/*** set底层依赖map防止重复的key,map集合底层依靠equals比较防止重复的key*/Stream<Student> stream = students.stream();Set<Student> collect = stream.collect(Collectors.toSet());Iterator<Student> iterator = collect.iterator();while (iterator.hasNext()) {Student next = iterator.next();System.out.println(next.getName() + " -> " + next.getScore());}}
结果:文章插图
Stream将list转换为Maplist集合转成stream流之后 , 通过<R, A> R collect(Collector<? super T, A, R> collector),在通过
Collector<T, ?, Map<K,U>> toMap(Function<? super T, ? extends K> keyMapper,Function<? super T, ? extends U> valueMapper) {return toMap(keyMapper, valueMapper, throwingMerger(), HashMap::new);}
来声明key和value 。如下代码 , 可以这么理解,stream.collect(Collectors.toMap(key, value)) , key和value都是通过new Function<T, K>,对于key:T指的是Steam流的类型(既Student),而K代表的是map中的key值,因此这里是String类型的,在apply方法中去返回key值,通过student的名字来最为key,因此这里返回student.getName() 。而第二个作为map的value,整体操作也是跟key差不多 , 主要还是需要注意的是 , value存的是student,因此需要使用Student类型 。Map<String, Student> map = stream.collect(Collectors.toMap(new Function<Student, String>() {@Overridepublic String apply(Student student) {return student.getName();}}, new Function<Student, Student>() {@Overridepublic Student apply(Student student) {return student;}}));
推荐阅读
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 国际象棋怎么玩谁吃谁(国际象棋的新手怎么玩)
- 烬,这个字怎么读,什么意思(烬这个字是什么意思)
- 烬字怎么读啊(烬的同音字)
- 烬怎么读(烬怎么读拼音)
- 传话对讲机怎么用(对讲机通话键图解)
- 【对讲机怎么用】对讲机正确使用方法(对讲机如何正确使用)
- 【博学谷学习记录】超强总结,用心分享|MySql连接查询超详细总结
- 一加9r参数配置_一加9r参数详情
- 小米怎么看卫视直播(小米怎么调出电视模式)
- P3834 【模板】可持久化线段树 2