反射,枚舉,lambda表達式

目錄

  • 反射
  • 枚舉的使用
  • Lambda表達式
      • 函數式接口
      • 語法
      • Lambda表達式語法精簡
    • 變量捕獲
    • Lambda在集合List中的使用


反射

作用:在Java代碼中,讓一個對象認識到自己
比如一個類的名字,里面的方法,屬性等
讓程序運行的過程,某個對象也能獲取到上述信息
Java提供了一組 API,通過這些 API 拿到指定對象的上述信息

注:API全稱Application Programming Interface,它是一組方法和類,提供給別人使用的,例如Scanner,Queue,List
如:
在這里插入圖片描述
像這樣得到String的全部信息

在這里插入圖片描述
獲取用戶輸入的想要的類型(動態的過程)
newInstance:獲取實例
forName:獲取對象

反射的作用:
把序列化的字符串還原成對象(反序列化)
序列化:把一個對象轉成一個字符串

獲取到類的某個屬性(Field):
在這里插入圖片描述
獲取到某個方法(Method):
在這里插入圖片描述

如果print1有兩個方法(重寫),具體調用哪個方法也是可以明確使用的
例如有一個print(String x)
如果調用上面的方法,可以用
Method pm=studentClass.getDeclaredMethod(“print”,String.class);
通過后續的參數,區分出當前要獲取的print是哪個版本,后續參數就表示‘獲取方法的參數列表’
完整訪問:

class Student{private int id=1;private String name;public void print(){System.out.println("id:"+id+"name:"+name);}public void print(String p){System.out.println(p+" id:"+id+" name:"+name);}
}
public class Test2 {public void test1() throws ClassNotFoundException, NoSuchFieldException, IllegalAccessException {Class studentClass=Class.forName("Student");Field idField=studentClass.getDeclaredField("id");//創建一個對象Student student=new Student();//由于student的id是私有的,將它取出,相當于“開鎖”idField.setAccessible(true);//設置里面的值idField.setInt(student,100);int id=idField.getInt(student);//獲取值System.out.println(id);}public void test2() throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {//通過反射調用 Student 方法Class studentClass=Student.class;//拿到方法對象Method pm=studentClass.getDeclaredMethod("print",String.class);Student student=new Student();//隨便創建一個對象pm.setAccessible(true);pm.invoke(student,"hello,");//調用方法}public static void main(String[] args) throws InvocationTargetException, NoSuchMethodException, IllegalAccessException {Test2 test=new Test2();test.test2();//結果:hello, id:1 name:null}
}

通過反射,能隨意訪問任意對象的任意屬性
反射的缺點:大大降低了效率,繞過了源代碼,提高了維護成本,不到萬不得已不要使用

枚舉的使用

在這里插入圖片描述

public enum Gender {//每個枚舉項通常用大寫字母來表示,本質上是一組常量//這幾個常量類型都是Gender,但值不同//常量使用都好分割MALE,FEMALE,OTHER
}

在main方法中使用:
在這里插入圖片描述

此外,枚舉中還能指定屬性和方法(枚舉和類很相似)

枚舉和類的區別:
類可以隨意在外面創建實例,但枚舉不行,
枚舉項的創建必須在 枚舉的內部進行(構造方法必須是私有的)
在這里插入圖片描述

Color c=Color.RED;System.out.println(c.getName());//結果:紅色

枚舉不可繼承,無法擴展

問:能否通過反射,拿到私有的構造方法,然后在枚舉外面創建出新的枚舉項?
答:不能,Java的反射 API 中,針對枚舉值特殊情況做了特殊處理

Lambda表達式

函數式接口

由于Java沒有其他編程語言擁有的匿名函數(沒有名字的函數,用完一次就扔了,通常作為“回調函數”用,類似于Comparetor,Comparable)
Java引入“函數式接口” 來引申出匿名函數=>這就是Lambda 表達式
如果一個接口里面只有一個抽象方法,就可以稱為函數式接口

語法

Lambda表達式語法精簡

  1. 參數類型可以省略,如果需要省略每個參數的類型都要省略
  2. 參數的?括號??只有?個參數,那么?括號可以省略
  3. 如果?法體當中只有?句代碼,那么?括號可以省略
  4. 如果?法體中只有?條語句,且是return語句,那么?括號可以省略,且去掉return關鍵字

1.比如優先級隊列調用Comparator
正常用匿名內部類寫法如下:

public class Test5 {class Student{public String name;public int id;}public static void main(String[] args) {PriorityQueue<Student> priorityQueue=new PriorityQueue<>(new Comparator<Student>() {@Overridepublic int compare(Student o1, Student o2) {return o1.id-o2.id;}});}

而使用Lambda表達式更簡單:

public static void main(String[] args) {PriorityQueue<Student> priorityQueue=new PriorityQueue<>((o1, o2) -> o1.id-o2.id);}

(o1,o2)里面表示形參列表,形參的參數類型是可以省略的
-> 是Lambda的關鍵標志,一看到這個箭頭,就知道是Lambda
o1.id-o2.id 是lambda的函數體(如果 lambda 里只有一句return代碼,{ } 就可以省略,return也能省略)

2.例如使用函數式接口:

interface MyInterface{//函數式接口void print(String s);
}public class Test6 {//用lambda表達式MyInterface myInterface=(s)-> System.out.println(s);//不用lambda表達式MyInterface myInterface1=new MyInterface() {@Overridepublic void print(String s) {System.out.println(s);}};
}

可見lambda表達式能大量減少代碼量

3.把 lambda 表達式的內容作為另一個方法的實參(前提是 該形參的類型必須是函數式接口):

interface MyComparator{int compare(String s1,String s2);
}
class MyPriorityQueue{public MyPriorityQueue(MyComparator comparator){//函數式接口作為形參}
}
public class Test7 {public static void main(String[] args) {MyPriorityQueue queue=new MyPriorityQueue((s1,s2)->s1.compareTo(s2));}
}

第四個例子用的比較少,可以了解

lambda表達式最主要的功能就是省略,寫起來簡便

變量捕獲

在 Lambda 表達式里捕獲的變量必須是 final 或者是事實上的 final(即一旦賦值就不會再改變)

lambda 表達式能夠捕獲外部的變量,在內部進行使用
在這里插入圖片描述

lambda的變量捕獲,能把創建后銷毀掉的變量再拿出來(這是很可怕的一件事)
相當于上頭斷了線,下面還在執行
在這里插入圖片描述

Lambda 能夠使用捕獲的變量的原因:在定義 lambda 的時候就把捕獲的變量在 lambda 內部拷貝(地址不同)了一份
所以我們不能讓捕獲到的num(變量) 之后還能繼續修改否則拷貝的和外面的num會出現歧義
因此,規定捕獲到的變量必須是final的或沒有進行修改的

Lambda在集合List中的使用

public class Test8 {public static void main(String[] args) {List<Integer> list=new ArrayList<>();list.add(1);list.add(2);list.add(3);for (int i=0;i<list.size();i++){//正常寫法System.out.print(list.get(i)*2+" ");}//用lambda表達式寫list.forEach(i -> System.out.print(i*2+" "));}
}

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

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

相關文章

鴻蒙移動應用開發--渲染控制實驗

任務&#xff1a;使用“對象數組”、“ForEach渲染”、“Badge角標組件”、“Grid布局”等相關知識&#xff0c;實現生效抽獎卡案例。如圖1所示&#xff1a; 圖1 生肖抽獎卡實例圖 圖1(a)中有6張生肖卡可以抽獎&#xff0c;每抽中一張&#xff0c;會通過彈層顯示出來&#xf…

webpack基礎使用了解(入口、出口、插件、加載器、優化、別名、打包模式、環境變量、代碼分割等)

目錄 1、webpack簡介2、簡單示例3、入口(entry)和輸出(output)4、自動生成html文件5、打包css代碼6、優化&#xff08;單獨提取css代碼&#xff09;7、優化&#xff08;壓縮過程&#xff09;8、打包less代碼9、打包圖片10、搭建開發環境&#xff08;webpack-dev-server&#xf…

Java快速上手之實驗4(接口回調)

1&#xff0e;編寫接口程序RunTest.java&#xff0c;通過接口回調實現多態性。解釋【代碼4】和【代碼6】的執行結果為何不同&#xff1f; interface Runable{ void run(); } class Cat implements Runable{ public void run(){ System.out.println("貓急上樹.."…

Volcano 實戰快速入門 (一)

一、技術背景 隨著大型語言模型&#xff08;LLM&#xff09;的蓬勃發展&#xff0c;其在 Kubernetes (K8s) 環境下的訓練和推理對資源調度與管理提出了前所未有的挑戰。這些挑戰主要源于 LLM 對計算資源&#xff08;尤其是 GPU&#xff09;的巨大需求、分布式任務固有的復雜依…

Qwen2.5簡要全流程以及QA

1 輸入prompt 得到input id input id&#xff1a; [B,L] # batch size , lenth 2 embeding之后得到 input_embeds: [B,L,D] # demensions 3 進入Transformer層 先通過linear層得到shape不變的 QKV 多頭注意力 分割Dimension &#xff0c; kv變成 [B,H,L,head_dim] h是…

爬蟲學習——Item封裝數據與Item Pipeline處理數據

一、Item封裝數據 對于有字段的數據&#xff0c;最好的數據結構維護方法為字典類型(dict)&#xff0c;但是由于字典不便于攜帶元數據和傳遞給其他組件使用&#xff0c;故可以使用Item類封裝爬取到的數據。 這里涉及兩個類&#xff1a;Item基類和Field類 兩者的使用關系如下&…

【React】狀態管理 Context API \ MobX \ Redux

Context APIMobXRedux React有自己狀態管理&#xff0c;周邊生態也有很多狀態管理 Context API 直接從react中引入并調用即可&#xff0c;context包含兩個東西&#xff1a; Provider&#xff1a;提供商&#xff08;翻譯&#xff09;&#xff0c;提供數據&#xff1b;屬性&…

RK3588上編譯opencv 及基于c++實現圖像的讀入

參考博文&#xff1a; https://blog.csdn.net/qq_47432746/article/details/147203889 一、安裝依賴包 sudo apt install build-essential cmake git pkg-config libgtk-3-dev libavcodec-dev libavformat-dev libswscale-dev libv4l-dev libxvidcore-dev libx264-dev libjpe…

MATLAB 訓練CNN模型 yolo v4

學生對小車控制提出了更好的要求&#xff0c;能否加入深度學習模型。 考慮到小車用matlab來做&#xff0c;yolo v5及以上版本都需要在pytorch下訓練&#xff0c;還是用早期版本來演示。 1 yolov4 調用 參考 trainYOLOv4ObjectDetector (mathworks.com) name "tiny-yo…

Windows下使用 VS Code + g++ 開發 Qt GUI 項目的完整指南

&#x1f680; 使用 VS Code g 開發 Qt GUI 項目的完整指南&#xff08;Windows MSYS2&#xff09; 本指南幫助你在 Windows 下使用 VS Code g CMake Qt6 快速搭建 Qt GUI 項目&#xff0c;適合熟悉 Visual Studio 的開發者向跨平臺 VS Code 工具鏈遷移。 &#x1f6e0;?…

開源漏洞掃描器:OpenVAS

一、OpenVAS介紹 OpenVAS (Open Vulnerability Assessment System) 是一款功能強大的開源漏洞掃描器。它由 Greenbone Networks 開發和維護&#xff0c;是 Greenbone 安全管理器 (GSM) 產品的基礎&#xff0c;同時也有免費的社區版本&#xff08;Greenbone Community Edition&…

Redis Pipeline 詳解

Redis Pipeline 詳解 Redis 無 Pipeline 耗時情況 : #mermaid-svg-8RIiJyeBO0uIrWjr {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-8RIiJyeBO0uIrWjr .error-icon{fill:#552222;}#mermaid-svg-8RIiJyeBO0uIrWjr .…

2025.04.24【3D】3D繪圖入門指南

Nifty graph A contribution by Matt Asher. 3D animation A 3D animated scatterplot made with R and rgl. 文章目錄 Nifty graph3D animation 2025.04.24【3D】| 3D繪圖入門指南什么是3D繪圖&#xff1f;為什么使用3D繪圖&#xff1f;如何在R中進行3D繪圖&#xff1f;安裝…

[特殊字符] 分布式事務中,@GlobalTransactional 與 @Transactional 到底怎么配合用?

在微服務架構中&#xff0c;隨著系統模塊的拆分&#xff0c;單體應用中的本地事務已經無法滿足跨服務的數據一致性需求。此時&#xff0c;我們就需要引入分布式事務解決方案&#xff0c;比如 Seata。在使用 Seata 的過程中&#xff0c;很多人會遇到一個常見的疑問&#xff1a; …

TDengine 集群高可用方案設計(二)

四、TDengine 集群高可用方案設計 4.1 硬件與網絡架構設計 服務器選型&#xff1a;選擇配置高、穩定性強的服務器&#xff0c;如戴爾 PowerEdge R740xd、華為 RH2288H V5 等。以戴爾 PowerEdge R740xd 為例&#xff0c;它配備英特爾至強可擴展處理器&#xff0c;具備高性能計…

從對數變換到深度框架:邏輯回歸與交叉熵的數學原理及PyTorch實戰

目錄 前言 一、連乘變連加二、最小化損失函數2.1交叉熵2.2 二分類交叉熵2.3 多分類交叉熵三、邏輯回歸與二分類3.1 邏輯回歸與二分類算法理論講解3.1.1 散點輸入3.1.2 前向計算3.1.3 Sigmoid函數引入3.1.4 參數初始化3.1.5 損失函數3.1.6 開始迭代3.1.7 梯度下降顯示四、基于框…

高企復審獎補!2025年合肥市高新技術企業重新認定獎勵補貼政策及申報條件

一、合肥市高新技術企業重新認定獎勵補貼政策 &#xff08;一&#xff09;高新區高新技術企業重新認定復審補貼獎勵 重新認定為國家高新技術企業的給予5萬元一次性獎勵。 &#xff08;二&#xff09;經開區高新技術企業重新認定復審補貼獎勵 對重新認定的企業&#xff0c;給…

Spring Boot 中配置線程池時優化 `ThreadPoolTaskExecutor` 的配置總結

在 Spring Boot 中配置線程池時&#xff0c;可以通過以下方式進一步優化 ThreadPoolTaskExecutor 的配置&#xff0c;提升性能、靈活性和可靠性&#xff1a; 優化點 1&#xff1a;合理設置線程池參數 關鍵參數調整 Bean(name "taskExecutor") public Executor tas…

opencv 圖像的旋轉

圖像的旋轉 1 單點旋轉2. 圖片旋轉&#xff08;cv2.getRotationMatrix2D&#xff09;3. 插值方法3.1 最近鄰插值(cv2.INTER_NEAREST)3.2 雙線性插值(cv2.INTER_LINEAR)3.3 像素區域插值&#xff08;cv2.INTER_AREA&#xff09;3.4 雙三次插值&#xff08;cv2.INTER_CUBIC&#…

如何在 Odoo 18 中配置自動化動作

如何在 Odoo 18 中配置自動化動作 Odoo是一款多功能的業務管理平臺&#xff0c;旨在幫助各種規模的企業更高效地處理日常運營。憑借其涵蓋銷售、庫存、客戶關系管理&#xff08;CRM&#xff09;、會計和人力資源等領域的多樣化模塊&#xff0c;Odoo 簡化了業務流程&#xff0c…