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…...

TDengine 快速体验(Docker 镜像方式)
简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能,本节首先介绍如何通过 Docker 快速体验 TDengine,然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker,请使用 安装包的方式快…...
FFmpeg 低延迟同屏方案
引言 在实时互动需求激增的当下,无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作,还是游戏直播的画面实时传输,低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架,凭借其灵活的编解码、数据…...
连锁超市冷库节能解决方案:如何实现超市降本增效
在连锁超市冷库运营中,高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术,实现年省电费15%-60%,且不改动原有装备、安装快捷、…...

Python实现prophet 理论及参数优化
文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候,写过一篇简单实现,后期随着对该模型的深入研究,本次记录涉及到prophet 的公式以及参数调优,从公式可以更直观…...
Rapidio门铃消息FIFO溢出机制
关于RapidIO门铃消息FIFO的溢出机制及其与中断抖动的关系,以下是深入解析: 门铃FIFO溢出的本质 在RapidIO系统中,门铃消息FIFO是硬件控制器内部的缓冲区,用于临时存储接收到的门铃消息(Doorbell Message)。…...

PLC入门【4】基本指令2(SET RST)
04 基本指令2 PLC编程第四课基本指令(2) 1、运用上接课所学的基本指令完成个简单的实例编程。 2、学习SET--置位指令 3、RST--复位指令 打开软件(FX-TRN-BEG-C),从 文件 - 主画面,“B: 让我们学习基本的”- “B-3.控制优先程序”。 点击“梯形图编辑”…...

Qt/C++学习系列之列表使用记录
Qt/C学习系列之列表使用记录 前言列表的初始化界面初始化设置名称获取简单设置 单元格存储总结 前言 列表的使用主要基于QTableWidget控件,同步使用QTableWidgetItem进行单元格的设置,最后可以使用QAxObject进行单元格的数据读出将数据进行存储。接下来…...

LangChain + LangSmith + DeepSeek 入门实战:构建代码生成助手
本文基于 Jupyter Notebook 实践代码,结合 LangChain、LangSmith 和 DeepSeek 大模型,手把手演示如何构建一个代码生成助手,并实现全流程追踪与优化。 一、环境准备与配置 1. 安装依赖 pip install langchain langchain_openai2. 设置环境变…...

夏普比率(Sharpe ratio)
具有投资常识的人都明白,投资光看收益是不够的,还要看承受的风险,也就是收益风险比。 夏普比率描述的正是这个概念,即每承受一单位的总风险,会产生多少超额的报酬。 用数学公式描述就是: 其中࿱…...

android关于pthread的使用过程
文章目录 简介代码流程pthread使用hello_test.cppAndroid.bp 编译过程报错处理验证过程 简介 android开发经常需要使用pthread来编写代码实现相关的业务需求 代码流程 pthread使用 需要查询某个linux函数的方法使用,可以使用man 函数名 // $ man pthread_crea…...