Day12-【Java SE进阶】JDK8新特性:Lambda表达式、方法引用、常见算法、正则表达式、异常
一、JDK8新特性
1.Lambda表达式
Lambda表达式是JDK 8开始新增的一种语法形式;作用:用于简化名内部类的代码写法。

注意:Lambda表达式并不是说能简化全部匿名内部类的写法,只能简化函数式接口的匿名内部类。
- 有且仅有一个抽象方法的接口。
- 注意:将来我们见到的大部分函数式接口,上面都可能会有@Functionalinterface的注解,有该注解:的接口就必定是函数式接口。
package com.API;public class LambdaTest {public static void main(String[] args) {Animal a = new Animal() {@Overridepublic void run() {System.out.println("汪汪队立大功!");}};a.run();//对于类无法使用lambda函数的Swim s = new Swim() {@Overridepublic void swim() {System.out.println("小鲤鱼历险记!");}};s.swim();Swim s1 = () -> {System.out.println("小鲤鱼历险记2!");};s1.swim();}
}abstract class Animal {public abstract void run();
}interface Swim {void swim();
}
2.Lambda表达式省略规则
- 参数类型可以省略不写。
- 如果只有一个参数,参数类型可以省略,同时()也可以省略。
- 如果Lambda表达式中的方法体代码只有一行代码,可以省略大括号不写,同时要省略分号!此时,如果这行代码是return语句,也必须去掉return不写。
Arrays.setAll(prices,value->prices[value]*0.8);
3.方法引用
3.1静态方法的引用
静态方法的引用
类名::静态方法。
使用场景
- 如果某个Lambda表达式里只是调用一个静态方法,并且前后参数的形式一致,就可以使用静态方法引用。
3.2实例方法的引用
实例方法的引用
对象名::实例方法。
使用场景
如果某个Lambda表达式里只是调用一个实例方法,并且前后参数的形式一致,就可以使用实例方法引用。
package com.API;import java.util.Arrays;public class ArrayTest1 {public static void main(String[] args) {Student[] students =new Student[4];students[0]=new Student("蜘姝精",23);students[1]=new Student( "紫假", 26);students[2]=new Student( "紫霞",26);students[3]=new Student( "至蓉宝",24);//静态方法引用Arrays.sort(students,CompareByData::compareInt);System.out.println(Arrays.toString(students));//实例方法引用CompareByData compareByData = new CompareByData();Arrays.sort(students,compareByData::compareByAge);System.out.println(Arrays.toString(students));}
}
class Student implements Comparable<Student>{private String name;private int age;public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public Student(String name, int age) {this.name = name;this.age = age;}@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", age=" + age +'}';}@Overridepublic int compareTo(Student o) {return this.age-o.age;}
}
class CompareByData{public static int compareInt(Student o1,Student o2){return o1.getAge()-o2.getAge();}public int compareByAge(Student o1,Student o2){return o2.getAge()-o1.getAge();}
}
3.3特定类型方法的引用
特定类型的方法引用
类型::方法。
使用场景
如果某个Lambda表达式里只是调用一个实例方法,并且前面参数列表中的第一个参数是作为方法的主调后面的所有参数都是作为该实例方法的入参的,则此时就可以使用特定类型的方法引用
Arrays.sort(names,String::compareToIgnoreCase);
3.4构造器引用
类名::new。
使用场景
如果某个Lambda表达式里只是在创建对象,并且前后参数情况一致,就可以使用构造器引用

二、常见算法
解决某个实际问题的过程和方法!

2.1 冒泡排序
每次从数组中找出最大值放在数组的后面去。

import java.util.Arrays;public class Sort1 {public static void main(String[] args) {int[] arr = {5, 2, 3, 1};//控制轮数for (int i = 0; i < arr.length - 1; i++) {//i=0 1 2 [5, 2, 3, 1] 次数//i=0 第一轮 0 1 2 3//i=1 第二轮 0 1 2//i=2 第三轮 0 1for (int j = 0; j < arr.length - i - 1; j++) {if (arr[j] > arr[j + 1]) {int temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;}}}System.out.println(Arrays.toString(arr));}
}

2.2 选择排序
每轮选择当前位置,开始找出后面的较小值与该位置交换

import java.util.Arrays;public class Sort2 {public static void main(String[] args) {//1.准备好一个数组int[] arr = {5, 2, 3, 1};//2.控制轮数for (int i = 0; i < arr.length - 1; i++) {//i=0 j=1 2 3//i=1 j=2 3//i=2 j=3//每轮选择几次for (int j = i + 1; j < arr.length; j++) {if (arr[i] > arr[j]) {int temp = arr[i];arr[i] = arr[j];arr[j] = temp;}}}System.out.println(Arrays.toString(arr));}
}
优化
import java.util.Arrays;public class Sort2 {public static void main(String[] args) {//1.准备好一个数组int[] arr = {5, 2, 3, 1};//2.控制轮数for (int i = 0; i < arr.length - 1; i++) {//i=0 j=1 2 3//i=1 j=2 3//i=2 j=3int minIndex = i;//每轮选择几次for (int j = i + 1; j < arr.length; j++) {if (arr[minIndex] > arr[j]) {minIndex = j;}}if (i != minIndex) {int temp = arr[i];arr[i] = arr[minIndex];arr[minIndex] = temp;}}System.out.println(Arrays.toString(arr));}
}
2.3 查找算法
基本查找,顺序查找
注意:在数据量特别大的时候,基本查找这种从前往后挨个找的形式,性能是很差的!
二分查找(折半查找)
- 前提条件:数组中的数据必须是有序的。
- 核心思想:每次排除一半的数据,查询数据的性能明显提高极多!
- 结论:二分查找正常的折半条件应该是开始位置left<=结束位置right
public class Sort3 {public static void main(String[] args) {int[] a={7,23,79,81,103,127,131,147};System.out.println(binarySearch(a,81));}public static int binarySearch(int[] a,int data){//1、定义两个交量,一手站在左边位置,一个站在右边位置int left=0;int right=a.length-1;//2. 定义一个循环控制while (left<=right){//3.每次折半计算中间位置int mid=(left+right)/2;//4.判断当前要找的元素值,与中间位置处的元素值的大小情况。if(a[mid]>data){right=mid-1;}else if(a[mid]<data){left=mid+1;}else {return mid;}}return -1;}
}
三、正则表达式
就是由一些特定的字符组成,代表的是一个规则
- 用来校验数据格式是否合法
- 在一段文本中查找满足要求的内容
public class RegexTest1 {public static void main(String[] args) {String s="1349281263";boolean b = checkQQ(s);System.out.println(b);System.out.println(RegexQQ(s));}public static boolean RegexQQ(String qq){return qq!=null&&qq.matches("[1-9]\\d{5,19}");}public static boolean checkQQ(String qq) {if (qq == null || qq.startsWith("0") || qq.length() < 6 || qq.length() > 20)return false;for (int i = 0; i < qq.length(); i++) {char ch = qq.charAt(i);if (ch < '0' || ch > '9')return false;}return true;}
}
String提供了一个匹配正则表达式的方法
public boolean matches(string regex)
判断字符串是否匹配正则表达式,匹配返回true,不匹配返回false。

email.matches(“\w{2,}@\w{2,20}(\.\w{2,10}){1,2”))


System.out.println(s2.replaceAll( regex “(.)\1+”,replacement: “$1”));
(.)一组:.匹配任意字符的。
\11:为这个组声明一个组号:1号
+声明必须是重复的字
$1
$1可以去取到第1组代表的那个重复的字
public class RegexTest6 {public static void main(String[] args) {String str="我我我喜欢欢欢欢欢编编编编程程程程程程程程程";System.out.println(str.replaceAll("(.)\\1+","$1"));}
}

四、异常
异常就是代表程序出现的问题。

- Error:代表的系统级别错误(属于严重问题),也就是说系统一旦出现问题,sun公司会把这些问题封装成Error对象给出来说白了,Error是给sun公司自己用的,不是给我们程序员用的,因此我们开发人员不用管它。
- Exception:叫异常,它代表的才是我们程序可能出现的问题,所以,我们程序员通常会用Exception以及它的孩子来封装程序出现的问题。
- 运行时异常:RuntimeException及其子类,编译阶段不会出现错误提醒,运行时出现的异常(如:数组索引越界异常)
- 编译时异常:编译阶段就会出现错误提醒的。(如:日期解析异常)
- 使用Ctrl alt T键选择try catch包围可能出现的异常程序段抛出异常
- 在方法后throws异常,表示将方法内的异常抛出。

自定义异常
Java无法为这个世界上全部的问题都提供异常类来代表,如果企业自己的某种问题,想通过异常来表示,以便用异常来管理该问题,那就需要自己来定义异常类了
- 1、异常是用来查寻系统Bug的关键参考信息!
- 2、异常可以作为方法内部的一种特殊返回值,以便通知上层调用者底层的执行情况!


问题严重就自定义编译时异常,问题不严重就运行时异常。
public class RegexTest6 {public static void main(String[] args) {try {setAge1(160);}catch (Exception e){e.printStackTrace();}}public static void setAge(int age){if(age>0&&age<150){System.out.println("successful");}else {//用一个异常对象封装这个问题,throw抛出去这个异常对象throw new AgeIllegalRuntimeException("/age is illegal, your age is"+age);}}public static void setAge1(int age) throws AgeIllegalException {if(age>0&&age<150){System.out.println("successful");}else {//用一个异常对象封装这个问题,throw抛出去这个异常对象throw new AgeIllegalException("/age is illegal, your age is"+age);}}
}
异常的处理
开发中对于异常的常见处理方式

可以都写Exception优化写法的
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;public class ExceptionTest3 {public static void main(String[] args) {try {test1();} catch (ParseException e) {e.printStackTrace();// 打印出这个异常对象的信息。记录下来。} catch (FileNotFoundException e) {e.printStackTrace();// 打印出这个异常对象的信息。记录下来。}finally {System.out.println("异常处理完毕");}}public static void test1() throws ParseException, FileNotFoundException {SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");Date d=simpleDateFormat.parse("2024-1-2 12:21:13");System.out.println(d);test2();}public static void test2() throws FileNotFoundException {InputStream is=new FileInputStream("D:/meinv.jpg");}
}
import java.util.Scanner;public class ExceptionTest4 {public static void main(String[] args) {//尝试修复while (true) {try {System.out.println(getMoney());break;} catch (Exception e) {System.out.println("请您输入合法的数字!");}}}public static double getMoney(){Scanner scanner = new Scanner(System.in);while (true) {System.out.println("请输入价钱!");double v = scanner.nextDouble();if(v>0) {return v;}System.out.println("您输入的不合格!");}}
}

相关文章:
Day12-【Java SE进阶】JDK8新特性:Lambda表达式、方法引用、常见算法、正则表达式、异常
一、JDK8新特性 1.Lambda表达式 Lambda表达式是JDK 8开始新增的一种语法形式;作用:用于简化名内部类的代码写法。 注意:Lambda表达式并不是说能简化全部匿名内部类的写法,只能简化函数式接口的匿名内部类。 有且仅有一个抽象方法的接口。注意:将来我们见到的大部…...
go mod中如何解决 xxx/yyy/lib@v1.1.0: unrecognized import path
需要检查的几个地方 这个错误通常出现在 Go 模块系统无法找到指定版本的模块时。有几种可能的原因和解决方法: 模块未被发布或标记: 确保 xxx/yyy/lib 模块的版本 v1.1.0 已经被正确地发布或标记。你可以在对应的 GitLab 仓库中查看是否存在 v1.1.0 标签…...
比较Python和Rust的内存管理机制
大家好,内存管理是编程语言的基础,它确保着资源被有效利用,不同的编程语言采用不同的策略来管理内存。有些语言需要程序员手动管理内存,有些语言则自动化了内存管理过程。Python和Rust都采用了垃圾收集(Garbage Collec…...
Linux系统——Shell脚本——一键安装LNMP
#!/bin/bash #安装nginx echo "安装nginx服务" wget http://nginx.org/download/nginx-1.11.4.tar.gz &>/dev/null if [ $? -eq 0 ] thenecho "nginx-1.11.4安装包下载完成"echo "--开始安装必要的依赖文件--"yum install -y gcc gcc-c…...
算法复习之二分【备战蓝桥杯】
二分模板一共有两个,分别适用于不同情况。 算法思路:假设目标值在闭区间[l, r]中, 每次将区间长度缩小一半,当l r时,我们就找到了目标值。 版本一 当我们将区间[l, r]划分成[l, mid]和[mid 1, r]时,其更…...
如何做代币分析:以 SHIB 币为例
作者:lesleyfootprint.network 编译:cicifootprint.network 数据源:SHIB Token Dashboard (仅包括以太坊数据) 在加密货币和数字资产领域,代币分析起着至关重要的作用。代币分析指的是深入研究与代币相关…...
Springboot+vue的考勤管理系统(有报告)。Javaee项目,springboot vue前后端分离项目。
演示视频: Springbootvue的考勤管理系统(有报告)。Javaee项目,springboot vue前后端分离项目。 项目介绍: 采用M(model)V(view)C(controller)三层…...
https://htmlunit.sourceforge.io/
https://htmlunit.sourceforge.io/ 爬虫 HtmlUnit – Welcome to HtmlUnit HtmlUnit 3.11.0 API https://mvnrepository.com/artifact/net.sourceforge.htmlunit/htmlunit/2.70.0 https://s01.oss.sonatype.org/service/local/repositories/releases/content/org/htmlunit…...
回文链表(leetcode)
我自己第一个写的代码: bool isPalindrome(struct ListNode* head){struct ListNode* tail NULL;struct ListNode* pos NULL;if( head->next NULL){return true;}while( 1 ){if( head->next NULL || (head->next->next NULL && head->…...
大语言模型(LLM)技术名词表(一)
LLMs on a Phone:指在手机设备上运行的大型语言模型。 Scalable Personal AI:指用户可以在个人设备上对AI模型进行微调的技术。 Responsible Release:发布AI模型时考虑社会、法律和伦理影响的做法。 Multimodality:AI模型能处理…...
C++ 快速排序快速选择
目录 1、75. 颜色分类 2、912. 排序数组 3、 215. 数组中的第K个最大元素 4、LCR 159. 库存管理 III 1、75. 颜色分类 思路:利用快速排序思路,使用三指针分块进行优化。 [0,left]——小于key[left1,right-1]——等于key[right,nums.size()]——大于k…...
雅马哈伺服器TS-S系列说明具体详情内容可参看PDF目录内容
雅马哈伺服器TS-S系列说明具体详情内容可参看PDF目录内容...
SpringBoot底层原理
SpringBoot底层原理 一 配置优先级 1.配置方式 Springboot中支持三种配置方式,分别为: application.propertiesapplication.ymlapplication.yaml 2.配置优先级 当存在多份配置文件时,配置文件会按照它们的优先级生效。 优先级从高到底…...
【golang】25、图片操作
用 “github.com/fogleman/gg” 可以画线, 框 用 “github.com/disintegration/imaging” 可以变换颜色 一、渲染 1.1 框和字 import "github.com/fogleman/gg"func DrawRectangles(inPath string, cRects []ColorTextRect, fnImgNameChange FnImgNameChange) (st…...
kswapd0挖矿病毒攻击记录
文章目录 一、起因与病毒分析1、起因2、阿里云告警2.1 恶意脚本代码执行12.2 恶意脚本代码执行22.3恶意脚本代码执行32.4 恶意脚本代码执行4 3、病毒简单分析3.1 病毒的初始化3.2 病毒本体执行 4、总结 二、ubuntu自救指南1、病毒清理2、如何防御 一、起因与病毒分析 1、起因 …...
如何使用 takeUntil RxJS 操作符来声明性地管理订阅
简介 Angular 处理取消订阅可观察对象的操作,比如从 HTTP 服务返回的可观察对象或者使用 async 管道时。然而,对于其他情况,管理所有订阅并确保取消长期存在的订阅可能会变得困难。而且,取消大部分订阅的策略也会带来自己的问题。…...
在Centos中用Docker部署oracle-12c
一、介绍 Oracle 12c是Oracle 11g的后续版本。12c代表云计算(Cloud Computing),这是Oracle在该版本中强调的一个关键概念。它具有多租户架构、数据库内存、安全增强、大数据管理和自动化管理等功能。它被广泛应用于企业级应用程序和大型数据…...
JS进阶——高级技巧
版权声明 本文章来源于B站上的某马课程,由本人整理,仅供学习交流使用。如涉及侵权问题,请立即与本人联系,本人将积极配合删除相关内容。感谢理解和支持,本人致力于维护原创作品的权益,共同营造一个尊重知识…...
TG-ADMIN 权限管理系统
项目简介 该项目是一款基于 SpringBoot + Vue2 + Jwt + ElementUi的 RBAC模型管理系统。 主要以自定义拦截器和jwt结合进行权限验证 通过自定义指令实现按钮级别权限,使用经典的RBAC模型 什么是RBAC? 1、RBAC模型概述 RBAC模型(Role-Based Access Control:基于角色的…...
十五届蓝桥杯第三期模拟赛题单(C++、java、Python)
备战2024年蓝桥杯 省赛第三期模拟赛题单 备战Python大学A组 第一题 【问题描述】 请问 2023 有多少个约数?即有多少个正整数,使得 2023 是这个正整数的整数倍。 【问题描述】 这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果…...
多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度
一、引言:多云环境的技术复杂性本质 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时,基础设施的技术债呈现指数级积累。网络连接、身份认证、成本管理这三大核心挑战相互嵌套:跨云网络构建数据…...
内存分配函数malloc kmalloc vmalloc
内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...
智慧医疗能源事业线深度画像分析(上)
引言 医疗行业作为现代社会的关键基础设施,其能源消耗与环境影响正日益受到关注。随着全球"双碳"目标的推进和可持续发展理念的深入,智慧医疗能源事业线应运而生,致力于通过创新技术与管理方案,重构医疗领域的能源使用模式。这一事业线融合了能源管理、可持续发…...
《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》
引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...
理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端
🌟 什么是 MCP? 模型控制协议 (MCP) 是一种创新的协议,旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议,它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...
【JVM】- 内存结构
引言 JVM:Java Virtual Machine 定义:Java虚拟机,Java二进制字节码的运行环境好处: 一次编写,到处运行自动内存管理,垃圾回收的功能数组下标越界检查(会抛异常,不会覆盖到其他代码…...
关于 WASM:1. WASM 基础原理
一、WASM 简介 1.1 WebAssembly 是什么? WebAssembly(WASM) 是一种能在现代浏览器中高效运行的二进制指令格式,它不是传统的编程语言,而是一种 低级字节码格式,可由高级语言(如 C、C、Rust&am…...
算法:模拟
1.替换所有的问号 1576. 替换所有的问号 - 力扣(LeetCode) 遍历字符串:通过外层循环逐一检查每个字符。遇到 ? 时处理: 内层循环遍历小写字母(a 到 z)。对每个字母检查是否满足: 与…...
【网络安全】开源系统getshell漏洞挖掘
审计过程: 在入口文件admin/index.php中: 用户可以通过m,c,a等参数控制加载的文件和方法,在app/system/entrance.php中存在重点代码: 当M_TYPE system并且M_MODULE include时,会设置常量PATH_OWN_FILE为PATH_APP.M_T…...
代码规范和架构【立芯理论一】(2025.06.08)
1、代码规范的目标 代码简洁精炼、美观,可持续性好高效率高复用,可移植性好高内聚,低耦合没有冗余规范性,代码有规可循,可以看出自己当时的思考过程特殊排版,特殊语法,特殊指令,必须…...
