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 是这个正整数的整数倍。 【问题描述】 这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果…...

基于Flask实现的医疗保险欺诈识别监测模型
基于Flask实现的医疗保险欺诈识别监测模型 项目截图 项目简介 社会医疗保险是国家通过立法形式强制实施,由雇主和个人按一定比例缴纳保险费,建立社会医疗保险基金,支付雇员医疗费用的一种医疗保险制度, 它是促进社会文明和进步的…...

DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI
前一阵子在百度 AI 开发者大会上,看到基于小智 AI DIY 玩具的演示,感觉有点意思,想着自己也来试试。 如果只是想烧录现成的固件,乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外,还提供了基于网页版的 ESP LA…...

Module Federation 和 Native Federation 的比较
前言 Module Federation 是 Webpack 5 引入的微前端架构方案,允许不同独立构建的应用在运行时动态共享模块。 Native Federation 是 Angular 官方基于 Module Federation 理念实现的专为 Angular 优化的微前端方案。 概念解析 Module Federation (模块联邦) Modul…...
leetcodeSQL解题:3564. 季节性销售分析
leetcodeSQL解题:3564. 季节性销售分析 题目: 表:sales ---------------------- | Column Name | Type | ---------------------- | sale_id | int | | product_id | int | | sale_date | date | | quantity | int | | price | decimal | -…...
C# SqlSugar:依赖注入与仓储模式实践
C# SqlSugar:依赖注入与仓储模式实践 在 C# 的应用开发中,数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护,许多开发者会选择成熟的 ORM(对象关系映射)框架,SqlSugar 就是其中备受…...

SpringCloudGateway 自定义局部过滤器
场景: 将所有请求转化为同一路径请求(方便穿网配置)在请求头内标识原来路径,然后在将请求分发给不同服务 AllToOneGatewayFilterFactory import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; impor…...
【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)
1.获取 authorizationCode: 2.利用 authorizationCode 获取 accessToken:文档中心 3.获取手机:文档中心 4.获取昵称头像:文档中心 首先创建 request 若要获取手机号,scope必填 phone,permissions 必填 …...
A2A JS SDK 完整教程:快速入门指南
目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库ÿ…...

关于easyexcel动态下拉选问题处理
前些日子突然碰到一个问题,说是客户的导入文件模版想支持部分导入内容的下拉选,于是我就找了easyexcel官网寻找解决方案,并没有找到合适的方案,没办法只能自己动手并分享出来,针对Java生成Excel下拉菜单时因选项过多导…...

消防一体化安全管控平台:构建消防“一张图”和APP统一管理
在城市的某个角落,一场突如其来的火灾打破了平静。熊熊烈火迅速蔓延,滚滚浓烟弥漫开来,周围群众的生命财产安全受到严重威胁。就在这千钧一发之际,消防救援队伍迅速行动,而豪越科技消防一体化安全管控平台构建的消防“…...