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() {
            @Override
            public void run() {
                System.out.println("汪汪队立大功!");
            }
        };
        a.run();
        //对于类无法使用lambda函数的

        Swim s = new Swim() {
            @Override
            public 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;
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }


    @Override
    public 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               1
            for (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=3
            int 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("您输入的不合格!");
        }
    }
}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/422100.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

IntelliJ IDEA 2023 点击推送至远程仓库发生报错

开始我是直接在IDEA里创建的本地仓库&#xff0c;然后在gitee上的仓库是创建并初始化的&#xff0c;因为你点击初始化后&#xff0c;会默认帮你执行一些代码&#xff0c;然后你再在本地仓库推送至远程仓库就会出现不一致的情况。 当你本地的仓库与远程仓库中的内容不同步时&…

echarts vue 动画效果的水球图、波浪图教程

1、安装插件 前提是已经安装了echarts&#xff08;我的版本是4.2.1&#xff09; npm install echarts-liquidfill --save 我安装了3.1.0版本的&#xff0c;结果运行时报错"TypeError: wave.ensureState is not a function" 原因&#xff1a;echarts版本和echarts-l…

基于JAVA的聊天(ICQ)系统的设计于实现

一、绪论 ICQ是英文"I seek you "的简称&#xff0c;中文意思是我找你。ICQ最大的功能就是即时信息交流&#xff0c;只要记得对方的号码&#xff0c;上网时可以呼他&#xff0c;无论他在哪里&#xff0c;只要他上网打开ICQ&#xff0c;人们就可以随时交流。ICQ源于以…

GenAI助力DevOps,塑造软件工程的未来

自 2022 年以来&#xff0c;GenAI 无疑已成为一种普遍的技术趋势。在本文中&#xff0c;我们将探索 DevOps 中令人兴奋的 GenAI 领域&#xff0c;讨论其潜在优势、局限性、新兴趋势和最佳实践&#xff0c;深入了解 AI 支持的 DevOps 前沿世界&#xff0c;并探索这一强大组合如何…

Redis的主从搭建

1.准备两台机器&#xff0c;安装好redis 2.修改从服务器的redis配置 slaveof <masterip> <masterport>两个参数 masterip 主的ip 主的端口号 masterport 3. 启动redis 1.先启动主机redis 2.再启用从机redis 主机redis日志打印 从机redis 日志打印

水经微图Web版1.6.0发布

让每一个人都有自己的地图&#xff01; 水经微图&#xff08;简称“微图”&#xff09;新版已上线&#xff0c;在该版本中主要新增了点线面图层分组样式设置、图层排序并按序绘制、KML支持矢量符号的存储、KML支持态势标绘要素存储和新增历史地图文本样式等。 现在&#xff0…

Tomcat相关基础以及安装运行

目录 一、web概念 二、常见的web服务器 三、Tomcat 安装 下载&#xff1a; 安装&#xff1a; 四、Tomcat 目录结构 五、Tomcat 启动停止 一、web概念 软件架构&#xff1a; B/S&#xff1a; 浏览器/服务器端 ‐‐‐‐‐‐‐‐‐‐‐‐> 京东&#xff0c;网易&#xff0c…

[技巧]Arcgis之图斑四至点批量计算

前言 上一篇介绍了arcgis之图斑四至范围计算&#xff0c;这里介绍的图斑四至点的计算及获取&#xff0c;两者之间还是有差异的。 [技巧]Arcgis之图斑四至范围计算 这里说的四至点指的是图斑最东、最西、最南、最北的四个地理位置点坐标&#xff0c;如下图&#xff1a; 四至点…

Web组态可视化编辑器 快速绘制组态

随着工业智能制造的发展&#xff0c;工业企业对设备可视化、远程运维的需求日趋强烈&#xff0c;传统的单机版组态软件已经不能满足越来越复杂的控制需求&#xff0c;那么实现Web组态可视化界面成为了主要的技术路径。 行业痛点 对于软件服务商来说&#xff0c;将单机版软件转变…

禅道:提bug、管理case 7.0

一、禅道的介绍 &#xff08;1&#xff09;定义禅道是一个项目管理工具&#xff0c;也是一个bug管理工具&#xff0c;还是一个用例管理工具。 &#xff08;2&#xff09;作用&#xff1a;为了解决众多企业在管理中出现混乱&#xff0c;无序的现象&#xff0c;开发出来 &…

Java智慧云HIS医院信息化系统源码 更具灵活性、扩展性

目录 什么是云HIS 趋势与转变 HIS上云后有哪些好处 解决方案 云HIS组成 1、门诊挂号 2、住院管理 3、电子病历 4、药物管理 5、统计报表 6、综合维护 7、运营运维 什么是云HIS 云HIS是一种基于云计算技术的医院信息管理系统。云HIS可以帮助医院管理各类医院信息&a…

工作电压范围宽的国产音频限幅器D2761用于蓝牙音箱,输出噪声最大仅-90dBV

近年来随着相关技术的不断提升&#xff0c;音箱也逐渐从传统的音箱向智能音箱、无线音箱升级。同时在消费升级的背景下&#xff0c;智能音箱成为人们提升生活品质的方式之一。智能音箱是智能化和语音交互技术的产物&#xff0c;具有点歌、购物、控制智能家居设备等功能&#xf…

MyBatis 学习(六)之动态 SQL

目录 1 动态 SQL 介绍 2 if 标签 3 where 标签 4 set 标签 5 trim 标签 6 choose、when、otherwise 标签 7 foreach 标签 8 bind 标签 1 动态 SQL 介绍 动态 SQL 是 MyBatis 强大特性之一&#xff0c;极大的简化我们拼装 SQL 的操作。MyBatis 的动态 SQL 是基于 OGNL 的…

【ArcPy】简化ArcGISPro默认Python环境体量

参考文献 安装 ArcPy—ArcGIS Pro | 文档

利用IP地址识别风险用户:保护网络安全的重要手段

随着互联网的发展和普及&#xff0c;网络安全问题日益突出&#xff0c;各种网络诈骗、恶意攻击等风险不断涌现&#xff0c;给个人和企业的财产安全和信息安全带来了严重威胁。在这样的背景下&#xff0c;利用IP地址识别风险用户成为了保护网络安全的重要手段之一。IP数据云探讨…

太阳能供电井盖-物联网智能井盖监测系统-旭华智能

在这个日新月异的科技时代&#xff0c;城市的每一个角落都在悄然发生变化。而在这场城市升级的浪潮中&#xff0c;智能井盖以其前瞻性的科技应用和卓越的安全性能&#xff0c;正悄然崭露头角&#xff0c;变身马路上的智能“眼睛”&#xff0c;守护城市安全。 传统的井盖监测系统…

港大提出GraphEdit, 图数据编辑大模型!

论文链接&#xff1a;https://arxiv.org/abs/2402.15183 代码链接&#xff1a;https://github.com/HKUDS/GraphEdit 摘要 图结构学习&#xff08;Graph Structure Learning, GSL&#xff09;旨在通过生成新的图结构来捕捉图结构数据中节点之间的内在依赖性和交互关系。 图神…

SpringCloud微服务-Docker基本操作

Docker基本操作 文章目录 Docker基本操作1、镜像操作命令1.1、从DockerHub中拉取一个镜像并且查看1.2、镜像的导出和导入 2、容器相关命令2.1、创建运行一个Nginx容器2.2、进入容器&#xff0c;并且修改容器中的文件 3、数据卷3.1、操作数据卷命令3.2、案例实战-创建数据卷3.3、…

董兆祥出席工业废水资源化,开创变废为宝新途径演讲

演讲嘉宾&#xff1a;董兆祥 董事长 河北奥博水处理有限公司 演讲题目&#xff1a;工业废水资源化&#xff0c;开创变废为宝新途径 会议简介 “十四五”规划中提出&#xff0c;提高工业、能源领城智能化与信息化融合&#xff0c;明确“低碳经济”新的战略目标&#xff0c;热…

Vue+SpringBoot打造校园超市管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 供应商模块2.2 超市商品模块2.3 超市账单模块 三、系统设计3.1 前端架构设计3.2 后端架构设计 四、系统实现五、核心代码5.1 查询商品5.2 删除商品5.3 查询供应商5.4 查询账单5.5 新增账单 六、免责说明 一、摘要 1.1 …