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

在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/714000.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/714000.shtml
英文地址,請注明出處:http://en.pswp.cn/news/714000.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

分布式事務簡介

分布式事務簡介&#xff0c;通過組內分享學習到的知識&#xff0c;并進行討論。 主要內容 分布式事務簡介 分布式事務是指跨越多個數據庫或服務的一系列操作&#xff0c;這些數據庫或服務可能分布在網絡的不同節點上&#xff0c;它們共同組成一個完整的邏輯工作單元&#xf…

GEE必須會教程—蒸散發數據時間序列分析與下載

今天帶來的有關蒸散發數據的下載代碼&#xff0c;蒸散發數據在氣象氣候&#xff0c;農業干旱監測等領域應用廣泛&#xff0c;那么在GEE上如何方便快捷獲取蒸散發數據呢&#xff1f;今天跟著小編分享代碼&#xff0c;快來學習吧&#xff01;&#xff01; A.定義研究區域 //定義…

JSON-RPC 快速開始

文章目錄 JSON-RPC什么是JSON-RPCJSON-RPC java開源實現JSON-PRC go開源實現JSON-RPC 和 Restful 都屬于什么&#xff1f;RPC、JSON-RPC和HTTP區別 以太坊使用json-rpc&#xff1f;JSON-RPC和gRPCWEB開發中&#xff0c;使用JSON-RPC好&#xff0c;還是RESTful API好&#xff1f…

【前端素材】推薦優質數據統計后臺管理系統網頁Cleopatra.平臺模板(附源碼)

一、需求分析 在線后臺管理系統是指供管理員或運營人員使用的Web應用程序&#xff0c;用于管理和監控網站、應用程序或系統的運行和數據。它通常包括一系列工具和功能&#xff0c;用于管理用戶、內容、權限、數據等。下面是關于在線后臺管理系統的詳細分析&#xff1a; 1、功…

ssh簡介以及 windows 安裝ssh教程

SSH&#xff08;Secure Shell&#xff09;是一種網絡協議&#xff0c;用于計算機之間的加密登錄和其他安全網絡服務。通過 SSH&#xff0c;用戶可以安全地訪問遠程計算機&#xff0c;執行命令、傳輸文件等操作。SSH 使用公鑰加密技術&#xff0c;確保數據傳輸的安全性。本文將從…

TypeScript 哲學 - 2、Narrowing

四種類型守衛 1、truthiness narrowing 2、 3、 4、 control flow analysis

C語言:結構體(自定義類型)知識點(包括結構體內存對齊的熱門知識點)

和黛玉學編程呀&#xff0c;大家一起努力呀............. 結構體類型的聲明 回顧一下 struct tag { member-list; }variable-list; 創建和初始化 我們知道&#xff0c;在C語言中&#xff0c;對于一些數據是必須初始化的&#xff0c;但是結構體怎么創建并且初始化呢&#xff1…

【計算機網絡】TCP 如何實現可靠傳輸

TCP通過三次握手建立連接&#xff0c;四次揮手釋放連接&#xff0c;確保連接建立和連接釋放的可靠。 序列號、檢驗和、確認應答信號、重發機制、連接管理、窗口控制、流量控制、擁塞控制 標準回答 可靠傳輸就是通過TCP連接傳送的數據是沒有差錯、不會丟失、不重復并且按序到達的…

springboot+vue+mysql項目使用的常用注解

實體類常用注解 Data Data 是一個 Lombok 提供的注解&#xff0c;使用 Data 注解可以簡化代碼&#xff0c;使代碼更加簡潔易讀。 作用&#xff1a;自動為類生成常用的方法&#xff0c;包括 getter、setter、equals、hashCode 和 toString 等需要加Lombok的依賴 <depende…

rk3568-一種基于wifi的網絡環境搭建方案

前言&#xff1a; PC--Ubuntu--開發板 三者之間的網絡互相ping通很重要&#xff0c;尤其是ubuntu和開發板互ping成功最關鍵&#xff0c;關系到nfs&#xff0c;tftp等常用的開發手段。現在大多數開發板都帶有wifi芯片&#xff0c;現在提供一種方案可以三個設備無線地搭建網絡環境…

Open3D0.14.1編譯、安裝、demo使用教程

寫在前面 本文內容 Open3D在0.15版之前&#xff0c;沒有提供編譯好的包&#xff0c;要使用C版本必須自己編譯&#xff0c;本文是Open3D0.14.1在Windows下和Linux(Ubuntu1804)下的編譯、使用教程&#xff1b; Open3D其他版本的編譯和使用相關教程見 各個版本的Open3D、PCL的編譯…

STL常見容器(map/multimap容器)---C++

STL常見容器目錄&#xff1a; 8.map/ multimap容器8.1 map基本概念8.2 map構造和賦值8.3 map大小和交換8.4 map插入和刪除8.5 map查找和統計8.6 map容器排序8.6.1 內置類型排序8.6.2 自定義類型排序8.6.3 自定義和內置類型混合排序 8.map/ multimap容器 兩者基本一致&#xff…

用node寫后端環境運行時報錯Port 3000 is already in use

解決方法:關閉之前運行的3000端口,操作如下 1.WindowR輸入cmd確定,打開命令面板 2.查看本機端口詳情 netstat -ano|findstr "3000" 3.清除3000端口 taskkill -pid 41640 -f 最后再重新npm start即可,這里要看你自己項目中package.joson的啟動命令是什…

Flink:動態表 / 時態表 / 版本表 / 普通表 概念區別澄清

博主歷時三年精心創作的《大數據平臺架構與原型實現&#xff1a;數據中臺建設實戰》一書現已由知名IT圖書品牌電子工業出版社博文視點出版發行&#xff0c;點擊《重磅推薦&#xff1a;建大數據平臺太難了&#xff01;給我發個工程原型吧&#xff01;》了解圖書詳情&#xff0c;…

Python+PySide6實現一個選擇文件并做處理的GUI辦公小工具(完整代碼)

目錄 專欄導讀背景安裝注意事項完整代碼結尾專欄導讀 ?? 歡迎來到Python辦公自動化專欄—Python處理辦公問題,解放您的雙手 ?????? 博客主頁:請點擊——> 一晌小貪歡的博客主頁求關注 ?? 該系列文章專欄:請點擊——>Python辦公自動化專欄求訂閱 ?? 此外還…

天翼云登錄參數JavaSrcipt逆向

天翼云登錄參數 password 、comParam_curTime、comParam_seqCode、comParam_signature JavaSrcipt逆向 目標網站 https://m.ctyun.cn/wap/main/auth/login?redirect/my 目標參數 要逆向的有 password、comParam_curTime、comParam_seqCode、comParam_signature 四個參數 …

安卓使用ExoPlayer出現膨脹類異常

1.導包 implementation com.google.android.exoplayer:exoplayer-core:2.15.1implementation com.google.android.exoplayer:exoplayer-ui:2.15.1 2.在Androidifest.xml加入權限&#xff0c;我這里加了忘了與讀寫權限 <uses-permission android:name"android.permissio…

【Fastadmin/ThinkPHP5】使用Queue隊列方法詳細步驟

在現代應用開發中&#xff0c;合理利用隊列系統能夠有效提升系統的性能和響應速度&#xff0c;尤其是在處理耗時較長的任務時&#xff0c;如發送大量郵件、執行定時任務等。下面是如何在ThinkPHP框架中設置和使用隊列功能的詳細指南&#xff1a; 1.配置隊列服務 在applicatio…

Tomcat服務部署、優化

一 Tomcat的基本介紹 Tomcat概念 Tomcat 服務器是一個免費的開放源代碼的Web 應用服務器&#xff0c;屬于輕量級應用服務器&#xff0c;在中小型系統和并發訪問用戶不是很多的場合下被普遍使用&#xff0c;是開發和調試 JSP 程序的首選。 當在一臺機器上配置好Apache 服務器…

VMwareWorkstation17.0虛擬機搭建WindowsXP虛擬機(完整安裝步驟詳細圖文教程)

VMwareWorkstation17.0虛擬機搭建WindowsXP虛擬機&#xff08;完整安裝步驟詳細圖文教程&#xff09; 一、Windows XP1.Windows XP簡介2.Windows XP 的下載地址 二、配置 Windows XP 虛擬機運行環境1.新建虛擬機2.選擇類型配置3.插入WinXP光盤映像文件(ISO)4.選擇操作系統5.命名…