Day12-【Java SE进阶】JDK8新特性:Lambda表达式、方法引用、常见算法、正则表达式、异常

news2024/12/29 10:33:14

一、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("您输入的不合格!");
        }
    }
}

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【音视频开发好书推荐】《RTC程序设计:实时音视频权威指南》

1、WebRTC概述 WebRTC&#xff08;Web Real-Time Communication&#xff09;是一个由Google发起的实时音视频通讯C开源库&#xff0c;其提供了音视频采集、编码、网络传输&#xff0c;解码显示等一整套音视频解决方案&#xff0c;我们可以通过该开源库快速地构建出一个音视频通…

【前端寻宝之路】总结学习使用CSS的引入方式

&#x1f308;个人主页: Aileen_0v0 &#x1f525;热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法|MySQL| ​&#x1f4ab;个人格言:“没有罗马,那就自己创造罗马~” #mermaid-svg-BNJBIEvpN0GHNeJ1 {font-family:"trebuchet ms",verdana,arial,sans-serif;f…

C语言第三十五弹---文件操作(上)

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】 文件操作 1、为什么使用文件&#xff1f; 2、什么是文件&#xff1f; 2.1、程序文件 2.2、数据文件 2.3、文件名 3、二进制文件和文本文件 4、文件的打开和…

集成算法(随机森林,AdaBoost,Xgboost,Stacking模型)

目录 一、前言 二、Bagging模型 三、Boosting模型 四、Stacking模型 五、总结 一、前言 集成算法&#xff08;Enseamable learning&#xff09; 集成算法一般考虑树模型&#xff0c;KNN就不太适合 目的&#xff1a;让机器学习效果更好&#xff0c;单个不好&#xff0c;一起…

性能优化篇(七) UI优化注意事项以及使用Sprite Atlas打包精灵图集

UI优化注意事项 1.尽量避免使用IMGUI(OnGUI)来做游戏时的UI&#xff0c;因为IMGUI的开销比较大。 2.如果一个UGUI的控件不需要进行射线检测&#xff0c;则可以取消勾选Raycast Target 3.尽量避免使用完全透明的图片和UI控件。因为即使完全透明&#xff0c;我们看不见它&#xf…

BUUCTF------[HCTF 2018]WarmUp

开局一个表情&#xff0c;源代码发现source.php <?phphighlight_file(__FILE__);class emmm{public static function checkFile(&$page){$whitelist ["source">"source.php","hint">"hint.php"];if (! isset($page) |…

关于图形学中生成三角形库Triangle.Net的下载及简单使用

背景 Triangle.NET 是生成 2D&#xff08;约束&#xff09;Delaunay 三角剖分和点集或平面直线图的高质量网格。此库是基于 Jonathan Richard Shewchuk 的 Triangle 项目&#xff0c;主要用于图形学像Opengl(或Unity3D)中生成三角形使用。 下载 Triangle.Net是基于C#语言的库…

倾斜三维模型OSGB路径漫游——DasViewer

背景 有时候我们需要查看倾斜三维模型效果的效果&#xff0c;虽然也有很多软件可以用&#xff0c;比如CC、超图等等&#xff0c;但是这些软件都比较大&#xff0c;安装也比较麻烦&#xff0c;DasViewer这个软件就比较轻量&#xff0c;安装也简单&#xff0c;功能强大&#xff…

网络信息安全:nginx漏洞收集(升级至最新版本)

网络&信息安全&#xff1a;nginx漏洞收集&#xff08;升级至最新版本&#xff09; 一、风险详情1.1 nginx 越界写入漏洞(CVE-2022-41742)1.2 nginx 缓冲区错误漏洞(CVE-2022-41741)1.3 nginx 拒绝服务漏洞&#xff08;CNVD-2018-22806&#xff09; 二、nginx升级步骤 &…

使用GRU进行天气变化的时间序列预测

本文基于最适合入门的100个深度学习项目的学习记录&#xff0c;同时在Google clolab上面是实现&#xff0c;文末有资源连接 天气变化的时间序列的难点 天气变化的时间序列预测涉及到了一系列复杂的挑战&#xff0c;主要是因为天气系统的高度动态性和非线性特征。以下是几个主…

jpg图片怎么转成png?一个超实用的jpg转格式方法

Jpg是常见的图片格式之一&#xff0c;有时候需要将常见的jpg格式转换成png格式的图片来应对不同的需求。因为png格式的图片画质更清晰还支持透明度等&#xff0c;能够更好的保存图片质量。接下来&#xff0c;就给大家介绍一下jpg转换png格式的小窍门。只需要使用jpg格式转换器&…

Matlab高光谱遥感、数据处理与混合像元分解

光谱和图像是人们观察世界的两种方式&#xff0c;高光谱遥感通过“图谱合一”的技术创新将两者结合起来&#xff0c;大大提高了人们对客观世界的认知能力&#xff0c;本来在宽波段遥感中不可探测的物质&#xff0c;在高光谱遥感中能被探测。以高光谱遥感为核心&#xff0c;构建…

HMI方案技术分享|启明智显M4核心板适配RGB/LVDS接口屏幕教程

前言&#xff1a; 深圳市启明智显科技有限公司专注于HMI&#xff08;人机交互&#xff09;和AIoT&#xff08;人工智能物联网&#xff09;产品和解决方案的研发、设计和生产。公司产品覆覆盖了多种操作系统&#xff0c;包括Linux、RTOS和OneOs等。无论您的项目使用哪种系统&am…

policy-space response oracles (PSRO)含义

Algorithm 1 维护了一个所有玩家策略的策略池。然后循环地选定玩家&#xff0c;然后从他的策略集中选择出一个策略&#xff0c;固定其它所有玩家此时的策略&#xff0c;然后不断地训练这个策略使得该策略成为一个在别的玩家策略不变的情况下、近似的best respond。然后将其加入…

仿牛客网项目---关注模块的实现

本篇文章是关于我的项目的关注模块的开发。 关注模块的开发实现了用户之间的关注功能和关注列表的展示。通过使用相应的服务类处理关注和取消关注操作&#xff0c;并利用用户服务类获取用户信息&#xff0c;实现了关注功能的存储和查询。同时&#xff0c;通过触发关注事件&…

哈希的简单介绍

unordered系列关联式容器 在C98中&#xff0c;STL提供了底层为红黑树结构的一系列关联式容器&#xff0c;在查询时效率可达到 l o g 2 N log_2 N log2​N&#xff0c;即最差情况下需要比较红黑树的高度次&#xff0c;当树中的节点非常多时&#xff0c;查询效率也不理想。最好的…

少儿编程 中国电子学会C++等级考试一级历年真题答案解析【持续更新 已更新82题】

C 等级考试一级考纲说明 一、能力目标 通过本级考核的学生&#xff0c;能对 C 语言有基本的了解&#xff0c;会使用顺序结构、选择结构、循环结构编写程序&#xff0c;具体用计算思维的方式解决简单的问题。 二、考核目标 考核内容是根据软件开发所需要的技能和知识&#x…

深度学习_18_模型的下载与读取

在深度学习的过程中&#xff0c;需要将训练好的模型运用到我们要使用的另一个程序中&#xff0c;这就需要模型的下载与转移操作 代码&#xff1a; import math import torch from torch import nn from d2l import torch as d2l import matplotlib.pyplot as plt# 生成随机的…

私有化部署自己的ChatGPT,免费开源的chatgpt-next-web搭建

随着AI的应用变广&#xff0c;各类AI程序已逐渐普及&#xff0c;尤其是在一些日常办公、学习等与撰写/翻译文稿密切相关的场景&#xff0c;大家都希望找到一个适合自己的稳定可靠的ChatGPT软件来使用。 ChatGPT-Next-Web就是一个很好的选择。它是一个Github上超人气的免费开源…

新零售SaaS架构:订单履约系统的概念模型设计

订单履约系统的概念模型 订单&#xff1a;客户提交购物请求后&#xff0c;生成的买卖合同&#xff0c;通常包含客户信息、下单日期、所购买的商品或服务明细、价格、数量、收货地址以及支付方式等详细信息。 子订单&#xff1a;为了更高效地进行履约&#xff0c;大订单可能会被…