java8新特性【2023】
Lambda表达式
新的一套语法规则
是一个匿名函数
@Testpublic void test1(){Runnable r1 = new Runnable(){@Overridepublic void run() {System.out.println("线程A");}};r1.run();System.out.println("====================");Runnable r2 = () -> System.out.println("线程B");r2.run();}
public void test2(){//比大小Comparator<Integer> com1 = new Comparator<Integer>() {@Overridepublic int compare(Integer o1, Integer o2) {return Integer.compare(o1,o2);}};int i = com1.compare(15, 12);System.out.println(i);System.out.println("=======================");//比大小//函数式接口只有一个方法,就无需知道具体是哪个方法Comparator<Integer> com2 = (o1,o2) ->Integer.compare(o1,o2);int ii = com1.compare(15, 19);System.out.println(ii);}
方法引用
//比大小//函数式接口只有一个方法,就无需知道具体是哪个方法System.out.println("=======================");Comparator<Integer> com3 = Integer::compare;int iii = com1.compare(15, 15);System.out.println(iii);
格式【Lambda表达式的使用】分为8种
本质:作为接口的一个实例
public class LambdaTest1 {//11111无参无返回值的@Testpublic void test1(){Runnable r1 = new Runnable(){@Overridepublic void run() {System.out.println("线程A");}};r1.run();System.out.println("====================");Runnable r2 = () -> System.out.println("线程B");r2.run();}@Testpublic void test2() {//222222222222一个参数,但没有返回值Consumer<String> con = new Consumer<String>() {@Overridepublic void accept(String s) {System.out.println(s);}};con.accept("消费者");System.out.println("========================");//lambda的写法Consumer<String> conn = (String s) ->System.out.println(s);conn.accept("消费者11");}//33333333333数据类型可以省略,因为可以由编译器推断出来,称为"类型推断"@Testpublic void test3() {System.out.println("========================");//lambda的写法Consumer<String> conn1 = (s) ->System.out.println(s);conn1.accept("消费者22");}//444444444444444444若只需要一个参数时,参数的小括号可以省略@Testpublic void test4() {System.out.println("========================");//lambda的写法Consumer<String> conn1 = s ->System.out.println(s);conn1.accept("消费者33");}//555555555555555555555两个或以上的参数,多条执行行语句,并且可以有返回值@Testpublic void test5() {//lambda的写法//比大小Comparator<Integer> com1 = new Comparator<Integer>() {@Overridepublic int compare(Integer o1, Integer o2) {return Integer.compare(o1,o2);}};System.out.println("===========================");//比大小Comparator<Integer> com2 = new Comparator<Integer>() {@Overridepublic int compare(Integer o1, Integer o2) {System.out.println(o1);System.out.println(o2);return o1.compareTo(o2);}}; //比大小//66666666666System.out.println(com2.compare(15, 16));Comparator<Integer> com3 = (o1,o2) ->{System.out.println(o1);System.out.println(o2);return o1.compareTo(o2);};System.out.println(com3.compare(18, 12));}//7lambda只有一条语句,{}可以省略
}
函数式接口
只声明了一个抽样方法,则此接口就称为函数式接口
java四大核心函数式接口
Consumer<T>
:不返
Supplier<T>
:不给也返
Function<T,R>
R apply(T t)
Predicate<T>
:boolean test(T t)
方法引用与构造器引用
StreamAPI
对内存层面的多个数据,实现过滤,排序
可以对集合的数据进行操作,类似于sql执行的数据库查询
Stream操作三个步骤:创建----中间操作-------终止操作
创建:一个数据【如集合、数组】,获取一个流
中间操作:一个中间操作链,对数据源的数据进行处理
终止操作:一旦执行终止操作,就会执行中间操作链,并产生结果,之后不会被使用
创建Stream的方式
通过集合:
通过数组:
排序
自然排序:
List<Integer> list = Arrays.asList(12, 43, 65, 34, 87, 0, -98, 7);list.stream().sorted().forEach(System.out::println);
定制排序:
List<Employee> employees = EmployeeData.getEmployees();employees.stream().sorted((e1, e2) -> {int ageValue = Integer.compare(e1.getAge(), e2.getAge());if (ageValue != 0) {return ageValue;} else {// 年龄相同,按工资从小到大排序return Double.compare(e1.getSalary(), e2.getSalary());// 年龄相同,按工资从大到小排序// return -Double.compare(e1.getSalary(), e2.getSalary());}}).forEach(System.out::println);
创建无限流
Stream.iterate(0, t -> t + 2).limit(10).forEach(System.out::println);
Stream.generate(Math::random).limit(10).forEach(System.out::println);
筛选与切片
筛选
Stream<Employee> stream = list.stream();// 练习:查询员工表中薪资大于 7000 的员工信息stream.filter(e -> e.getSalary() > 7000).forEach(System.out::println);
// 1-筛选与切片@Testpublic void test5() {List<Employee> list = EmployeeData.getEmployees();// filter(Predicate p)-接收 Lambda,从流中排除某些元素。Stream<Employee> stream = list.stream();// 练习:查询员工表中薪资大于 7000 的员工信息stream.filter(e -> e.getSalary() > 7000).forEach(System.out::println);// Employee{id=1002, name='马云', age=12, salary=9876.12}// Employee{id=1004, name='雷军', age=26, salary=7657.37}// Employee{id=1006, name='比尔盖茨', age=42, salary=9500.43}System.out.println();// limit(n)-截断流,使其元素不超过给定数量。// stream.limit(3).forEach(System.out::println);//closed已经关闭,需要重新生成list.stream().limit(3).forEach(System.out::println);// Employee{id=1001, name='马化腾', age=34, salary=6000.38}// Employee{id=1002, name='马云', age=12, salary=9876.12}// Employee{id=1003, name='刘强东', age=33, salary=3000.82}System.out.println();// skip(n)-跳过元素,返回一个扔掉了前 n 个元素的流。若流中元素不足 n 个,则list.stream().skip(3).forEach(System.out::println);// Employee{id=1004, name='雷军', age=26, salary=7657.37}// Employee{id=1005, name='李彦宏', age=65, salary=5555.32}// Employee{id=1006, name='比尔盖茨', age=42, salary=9500.43}// Employee{id=1007, name='任正非', age=26, salary=4333.32}// Employee{id=1008, name='扎克伯格', age=35, salary=2500.32}System.out.println();// distinct()-筛选,通过流所生成元素的 hashCode() 和 equals() 去除重复元素list.add(new Employee(1010, "刘强东", 40, 8000));list.add(new Employee(1010, "刘强东", 42, 8000));list.add(new Employee(1010, "刘强东", 40, 8000));list.add(new Employee(1010, "刘强东", 40, 8000));list.add(new Employee(1010, "刘强东", 40, 8000));// System.out.println(list);// [Employee{id=1001, name='马化腾', age=34, salary=6000.38}, Employee{id=1002, name='马云', age=12, salary=9876.12},// Employee{id=1003, name='刘强东', age=33, salary=3000.82}, Employee{id=1004, name='雷军', age=26, salary=7657.37},// Employee{id=1005, name='李彦宏', age=65, salary=5555.32}, Employee{id=1006, name='比尔盖茨', age=42,// salary=9500.43}, Employee{id=1007, name='任正非', age=26, salary=4333.32}, Employee{id=1008, name='扎克伯格',// age=35, salary=2500.32}, Employee{id=1010, name='刘强东', age=40, salary=8000.0}, Employee{id=1010, name='刘强东',// age=42, salary=8000.0}, Employee{id=1010, name='刘强东', age=40, salary=8000.0}, Employee{id=1010, name='刘强东',// age=40, salary=8000.0}, Employee{id=1010, name='刘强东', age=40, salary=8000.0}]System.out.println("=================");list.stream().distinct().forEach(System.out::println);// Employee{id=1001, name='马化腾', age=34, salary=6000.38}// Employee{id=1002, name='马云', age=12, salary=9876.12}// Employee{id=1003, name='刘强东', age=33, salary=3000.82}// Employee{id=1004, name='雷军', age=26, salary=7657.37}// Employee{id=1005, name='李彦宏', age=65, salary=5555.32}// Employee{id=1006, name='比尔盖茨', age=42, salary=9500.43}// Employee{id=1007, name='任正非', age=26, salary=4333.32}// Employee{id=1008, name='扎克伯格', age=35, salary=2500.32}// Employee{id=1010, name='刘强东', age=40, salary=8000.0}// Employee{id=1010, name='刘强东', age=42, salary=8000.0}}
去重
list.stream().distinct().forEach(System.out::println);
映射
小写变大写
List<String> list = Arrays.asList("aa", "bb", "cc", "dd");list.stream().map(str -> str.toUpperCase()).forEach(System.out::println);
Stream终止操作
输出结果forEach(System.out::println);
Stream的终止操作:匹配与查询
匹配所有
@Testpublic void test9(){List<Employee> employees = EmployeeData.getEmployees();boolean allMatch = employees.stream().allMatch(e->e.getAge()>18);System.out.println(allMatch);}
有一个匹配就可以
List<Employee> employees1 = EmployeeData.getEmployees();boolean allMatch1 = employees1.stream().anyMatch(e->e.getAge()>18);System.out.println(allMatch1);
求个数
最大值
最小值
并行流
把一个内容分成多个数据模块,并用不同的线程分别处理每个数据块的流,相比较串行流,并行流可以很大层度上提高程序的执行效率
Optional类
最大化的减少空指针异常
新的时间日期API
其他特性
学习过程全部操作
public class LambdaTest2 {// 创建 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);}// 1-筛选与切片@Testpublic void test5() {List<Employee> list = EmployeeData.getEmployees();// filter(Predicate p)-接收 Lambda,从流中排除某些元素。Stream<Employee> stream = list.stream();// 练习:查询员工表中薪资大于 7000 的员工信息stream.filter(e -> e.getSalary() > 7000).forEach(System.out::println);// Employee{id=1002, name='马云', age=12, salary=9876.12}// Employee{id=1004, name='雷军', age=26, salary=7657.37}// Employee{id=1006, name='比尔盖茨', age=42, salary=9500.43}System.out.println("1");// limit(n)-截断流,使其元素不超过给定数量。// stream.limit(3).forEach(System.out::println);//closed已经关闭,需要重新生成list.stream().limit(3).forEach(System.out::println);System.out.println("/2");// skip(n)-跳过元素,返回一个扔掉了前 n 个元素的流。若流中元素不足 n 个,则list.stream().skip(3).forEach(System.out::println);System.out.println();// distinct()-筛选,通过流所生成元素的 hashCode() 和 equals() 去除重复元素list.add(new Employee(1010, "刘强东", 40, 8000));list.add(new Employee(1010, "刘强东", 42, 8000));list.add(new Employee(1010, "刘强东", 40, 8000));list.add(new Employee(1010, "刘强东", 40, 8000));list.add(new Employee(1010, "刘强东", 40, 8000));System.out.println("=================");list.stream().distinct().forEach(System.out::println);}// 映射@Testpublic void test6() {// map(Function f)-接收一个函数作为参数,将元素转换成其他形式或提取信息,该函数会被应用到每个元素上,并将其映射成一个新的元素。List<String> list = Arrays.asList("aa", "bb", "cc", "dd");list.stream().map(str -> str.toUpperCase()).forEach(System.out::println);System.out.println("===--=-=-==0-");// 练习1:获取员工姓名长度大于 3 的员工的姓名。List<Employee> employees = EmployeeData.getEmployees();Stream<String> namesStream = employees.stream().map(Employee::getName);namesStream.filter(name -> name.length() > 3).forEach(System.out::println);System.out.println();// 练习2:Stream<Stream<Character>> streamStream = list.stream().map(LambdaTest2::fromStringToStream);streamStream.forEach(s -> {s.forEach(System.out::println);});System.out.println();// 集合里面套集合的方式,遍历优先使用 flatMap 方式// flatMap(Function f)-接受一个函数作为参数,将流中的每个值都换成另一个流,然后把所有流连接成一个流。Stream<Character> characterStream = list.stream().flatMap(LambdaTest2::fromStringToStream);characterStream.forEach(System.out::println);// a// a// b// b// c// c// d// d}// 将字符串中的多个字符构成的集合转换为对应的 Stream 的实例public static Stream<Character> fromStringToStream(String str) {// aArrayList<Character> list = new ArrayList<>();for (Character c : str.toCharArray()) {list.add(c);}return list.stream();}@Testpublic void test7() {ArrayList list1 = new ArrayList();list1.add(1);list1.add(2);list1.add(3);ArrayList list2 = new ArrayList();list2.add(4);list2.add(5);list2.add(6);list1.addAll(list2);System.out.println(list1);}// 3-排序@Testpublic void test8() {// sorted()-自然排序List<Integer> list = Arrays.asList(12, 43, 65, 34, 87, 0, -98, 7);list.stream().sorted().forEach(System.out::println);List<Employee> employees = EmployeeData.getEmployees();employees.stream().sorted((e1, e2) -> {int ageValue = Integer.compare(e1.getAge(), e2.getAge());if (ageValue != 0) {return ageValue;} else {// 年龄相同,按工资从小到大排序return Double.compare(e1.getSalary(), e2.getSalary());// 年龄相同,按工资从大到小排序// return -Double.compare(e1.getSalary(), e2.getSalary());}}).forEach(System.out::println);}
}
相关文章:

java8新特性【2023】
Lambda表达式 新的一套语法规则 是一个匿名函数 Testpublic void test1(){Runnable r1 new Runnable(){Overridepublic void run() {System.out.println("线程A");}};r1.run();System.out.println("");Runnable r2 () -> System.out.println("…...
刷题记录:牛客NC51101Lost Cows
传送门:牛客 题目描述: (2≤N≤8,000) cows have unique brands in the range 1..N. In a spectacular display of poor judgment, they visited the neighborhood watering hole and drank a few too many beers before dinner. When it was time to line up for their ev…...
华为OD机试 - 不等式 | 备考思路,刷题要点,答疑 【新解法】
最近更新的博客 华为OD机试 - 寻找路径 | 备考思路,刷题要点,答疑 【新解法】华为OD机试 - 最小叶子节点 | 备考思路,刷题要点,答疑 【新解法】华为OD机试 - 对称美学 | 备考思路,刷题要点,答疑 【新解法】华为OD机试 - 最近的点 | 备考思路,刷题要点,答疑 【新解法】华…...

GuLi商城-SpringCloud-OpenFeign测试远程调用
1. Feign 简介 Feign 是一个声明式的 HTTP 客户端,它的目的就是让远程调用更加简单。Feign 提供了HTTP请 求的模板,通过编写简单的接口和插入注解,就可以定义好 HTTP 请求的参数、格式、地址等信 息。Feign 整合了 Ribbon(负载…...

阿里云_山东鼎信短信的使用(云市场)
目录山东鼎信API工具类随机验证码工具类进行测试Pom依赖(可以先导入依赖)创建controllerSmsServiceSmsServiceImplswagger测试(也可以使用postman)山东鼎信API工具类 山东鼎信短信官网 找到java的Api,复制下来 适当改了一下,为了调用(类名SmsUtils) p…...

基于虚拟机机的代码保护技术
虚拟机保护技术是基于x86汇编系统的可执行代码转换为字节码指令系统的代码,以达到保护原有指令不被轻易逆向和篡改的目的。 字节码(Byte-code)是一种包含执行程序,由一序列 op 代码/数据对组成的 ,是一种中间码。字节是…...

Win10耳机有声音麦不能说话怎么办?麦克风说话别人听不到解决方法
网上找了一些解决办法,一般都是重复的,几个设置调来调去也就那样,没什么用 这种问题一般是“老式”一点的台式机会出现,提供的解决办法如下: 首先下载带面板的音频管理器,如realtek高清晰音频管理器&…...
The 22nd Japanese Olympiad in Informatics (JOI 2022/2023) Final Round 题解
交题:https://cms.ioi-jp.org/documentation A 给一个序列 a1,⋯,ana_1,\cdots,a_na1,⋯,an。 执行nnn个操作,第iii个操作为找出第iii个数前离其最近且与它相同的数的位置,把这两个数之间的数全部赋值aia_iai。求最后的序列。 考虑第…...

openEuler RISC-V 成功适配 VisionFive 2 单板计算机
近日,RISC-V SIG 成功在 VisionFive 2 开发板上适配欧拉操作系统,目前最新版本的 openEuler RISC-V 22.03 V2 镜像已在 VisionFive 2 开发板上可用,这是 openEuler 推动 RISC-V 生态演进的又一新进展。下载链接https://mirror.iscas.ac.c…...

2005-2022中国企业对外直接投资、OFDI海外投资明细、中国全球投资追踪数据CGIT(含非建筑施工类问题投资)
中国全球投资跟踪”(China Global Investment Tracker),数据库,美国企业研究所于1月28日发布。数据库显示,2005年以来,中国对外投资和建设总额已接近2万亿美元。该数据库是唯一一套涵盖中国全球投资和建设的…...

PCB学习笔记——使用嘉立创在线绘制原理图与PCB
嘉立创软件地址:https://lceda.cn/ 新建工程-新建原理图,在元件库中可以搜索元器件,可以直接放置在原理图上。 原理图绘制完成后,保存文件,设计-原理图转PCB,可以直接生成对应的PCB,设置边框&…...

【C++】类型转化
🌈欢迎来到C专栏~~类型转化 (꒪ꇴ꒪(꒪ꇴ꒪ )🐣,我是Scort目前状态:大三非科班啃C中🌍博客主页:张小姐的猫~江湖背景快上车🚘,握好方向盘跟我有一起打天下嘞!送给自己的一句鸡汤&…...
Mybatis -- resultMap以及分页
查询为null问题 要解决的问题:属性名和字段名不一致 环境:新建一个项目,将之前的项目拷贝过来 1、查看数据库的字段名 2、Java中的实体类设计 public class User { private int id; //id private String name; //姓名 private String passwo…...

Linux之进程
一.冯诺依曼体系 在计算机中,CPU(中央处理器)是不直接跟外部设备直接进行通信的,因为CPU处理速度太快了,而设备的数据读取和输入有太慢,而是CPU以及外设直接跟存储器(内存)打交道&am…...

结构体——“C”
各位CSDN的uu们你们好呀,今天,小雅兰的内容是结构体噢,之前我们在初始C语言中其实就已经学习过了结构体的知识,但是不是很全面,这次,我们也只是稍微详细一点,敬请期待小雅兰之后的博客ÿ…...

CCNP350-401学习笔记(51-100题)
51、Which statement about a fabric access point is true?A. It is in local mode and must be connected directly to the fabric edge switch. B. It is in local mode and must be connected directly to the fabric border node C. It is in FlexConnect mode and must …...

C语言学习_DAY_4_判断语句if_else和分支语句switch_case【C语言学习笔记】
高质量博主,点个关注不迷路🌸🌸🌸! 目录 1.案例引入 2.if判断语句的语法与注意事项 3.switch多分支语句的语法与注意事项 前言: 书接上回,我们已经学习了所有的数据类型、运算符,并且可以书写…...
实验07 赫夫曼编码及综合2022(带程序填空)
A. 【程序填空】赫夫曼编码题目描述给定n个叶子的权值,根据这些权值构造huffman树,并输出huffman编码参考课本第6.6节的算法6.12,注意算法中数组访问是从位置1开始赫夫曼构建中,默认左孩子权值不大于右孩子权值如果遇到两个孩子权…...

分布式 CAP BASE理论
文章目录CAP简介不是所谓的“3 选 2”CAP 实际应用案例BASE简介BASE 理论的核心思想总结CAP 简介 在理论计算机科学中,CAP 定理(CAP theorem)指出对于一个分布式系统来说,当设计读写操作时,只能同时满足以下三点中的…...
三调地类筛选器,Arcgis地类筛选
三调地类在使用是,需要分类统计,这个可以用于筛选; 标准地类筛选 农用地: DLBM IN(0303,0304,0306,0402,0101,0102,0103,0201,0201K,0202,0202K,0203,0203K,0204,0204K,0301,0301K,0302,0302K,0305,0307,0307K,0401,0403,0403K…...
Vue记事本应用实现教程
文章目录 1. 项目介绍2. 开发环境准备3. 设计应用界面4. 创建Vue实例和数据模型5. 实现记事本功能5.1 添加新记事项5.2 删除记事项5.3 清空所有记事 6. 添加样式7. 功能扩展:显示创建时间8. 功能扩展:记事项搜索9. 完整代码10. Vue知识点解析10.1 数据绑…...
java_网络服务相关_gateway_nacos_feign区别联系
1. spring-cloud-starter-gateway 作用:作为微服务架构的网关,统一入口,处理所有外部请求。 核心能力: 路由转发(基于路径、服务名等)过滤器(鉴权、限流、日志、Header 处理)支持负…...

【JavaEE】-- HTTP
1. HTTP是什么? HTTP(全称为"超文本传输协议")是一种应用非常广泛的应用层协议,HTTP是基于TCP协议的一种应用层协议。 应用层协议:是计算机网络协议栈中最高层的协议,它定义了运行在不同主机上…...
多场景 OkHttpClient 管理器 - Android 网络通信解决方案
下面是一个完整的 Android 实现,展示如何创建和管理多个 OkHttpClient 实例,分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...

《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析 (一)
CSI-2 协议详细解析 (一) 1. CSI-2层定义(CSI-2 Layer Definitions) 分层结构 :CSI-2协议分为6层: 物理层(PHY Layer) : 定义电气特性、时钟机制和传输介质(导线&#…...
在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module
1、为什么要修改 CONNECT 报文? 多租户隔离:自动为接入设备追加租户前缀,后端按 ClientID 拆分队列。零代码鉴权:将入站用户名替换为 OAuth Access-Token,后端 Broker 统一校验。灰度发布:根据 IP/地理位写…...
C++ 基础特性深度解析
目录 引言 一、命名空间(namespace) C 中的命名空间 与 C 语言的对比 二、缺省参数 C 中的缺省参数 与 C 语言的对比 三、引用(reference) C 中的引用 与 C 语言的对比 四、inline(内联函数…...
Robots.txt 文件
什么是robots.txt? robots.txt 是一个位于网站根目录下的文本文件(如:https://example.com/robots.txt),它用于指导网络爬虫(如搜索引擎的蜘蛛程序)如何抓取该网站的内容。这个文件遵循 Robots…...

关键领域软件测试的突围之路:如何破解安全与效率的平衡难题
在数字化浪潮席卷全球的今天,软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件,这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下,实现高效测试与快速迭代?这一命题正考验着…...

Sklearn 机器学习 缺失值处理 获取填充失值的统计值
💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 使用 Scikit-learn 处理缺失值并提取填充统计信息的完整指南 在机器学习项目中,数据清…...