java 10的區域性變數型別推斷Var的用法 - foojay
“必須編寫供人們經常閱讀的、卻·偶然地供機器執行的程式。”-Harold Abelson
在Java 10中,新增了新功能Local-Variable Type Inference。目的是在使用初始化程式宣告區域性變數時減少樣板程式碼並提高可讀性。
讓我們通過一個例子來理解這一點。在不使用Local-Variable Type Inference的情況下編寫了以下程式碼:
List<Employee> employees = Arrays.asList(new Employee(1, "Ashish", 28, 10000) , new Employee(2, "Ajay", 29, 1000) , new Employee(3, "Abhishek", 29, 10000)); Map<Integer, String> map = employees .stream() .collect(Collectors.toMap(Employee::getId,Employee::getName)); Map<Long, List<Employee>> listMap = employees .stream() .collect(Collectors.groupingBy(Employee::getSalary)); |
重構後,使用Java 10區域性變數型別推斷:
var employees = Arrays.asList(new Employee(1, "Ashish", 28, 10000) , new Employee(2, "Ajay", 29, 1000) , new Employee(3, "Abhishek", 29, 10000)); var employeeMap = employees.stream() .collect(Collectors.toMap(Employee::getId,Employee::getName)); var groupedMap = employees.stream() .collect(Collectors.groupingBy(Employee::getSalary)); |
在上面的重構程式碼中,編譯器可以通過檢視RHS宣告來自己推斷宣告的型別。這些只是一些示例,可以幫助您理解該功能以及我們如何使用區域性變數型別推斷。
現在,讓我們瞭解可以在哪裡使用區域性變數型別推斷以及在哪裡不能使用區域性變數型別推斷。
可以使用的地方
- 區域性變數初始化器
- 增強的forloop中的索引
- 在傳統的forloop中宣告的本地人
- try-with-resources語句的資源變數
- 隱式型別的lambda表示式的形式引數。(在Java 11中新增了支援)
以下程式碼段顯示了一些有效的示例:
var str = new String("Hello"); var list = new ArrayList<String>(); var integerList = List.of(1,2,3,4); for (var data :integerList) { System.out.println(data); } for (var i = 1; i <= integerList.size(); i++) { System.out.println(i); } var path = Paths.get("/src/main/resources/app.log"); try(var file = Files.lines(path)){ //some code } |
無法使用的地方
- 欄位
- 方法引數
- 方法返回型別
- 區域性變數宣告,無需任何初始化
- 不能使用null進行初始化
在下面的程式碼片段中說明如果以不支援的方式使用它將出現什麼編譯器錯誤。
//無法在沒有初始化程式的情況下推斷型別:'var' var x; //無法推斷型別:lambda表示式需要顯式的目標型別 var f = () -> {}; //無法推斷型別:變數初始值設定項為“ null” var g = null; //此處不允許使用陣列初始化程式 var k = {1, 2}; |
好處
由於此功能與可讀性相關,因此有些人會喜歡它,而有些人會討厭它。如果在程式碼檢查過程中有人說他/她不知道var的宣告型別,則意味著對他人來說不是很清楚,因此也許切換回“老式”方式來顯式宣告型別是畢竟還不錯。同樣,在某些情況下,宣告的型別非常明顯,因此您可以跳過顯式宣告的型別,而改用var。
相關文章
- JavaScript全域性作用域下,變數加var和不加var的區別。JavaScript變數
- 使用Java 10的var型別推斷的幾個注意點! - DZone JavaJava型別
- 我反編譯了Java 10的本地變數型別推斷編譯Java變數型別
- Java 10推斷型別和var關鍵字簡介Java型別
- Java基礎-成員變數和區域性變數的區別Java變數
- 強大的CSS:var變數的區域性作用域(繼承)特性CSS變數繼承
- 成員變數和區域性變數的區別變數
- Java區域性變數與全域性變數Java變數
- java 全域性變數和區域性變數Java變數
- 變數宣告帶var與不帶var的區別變數
- 使用var和不使用var宣告變數的區別變數
- var與let宣告變數的區別變數
- C#特性-匿名型別與隱式型別區域性變數C#型別變數
- Python中類變數、成員變數、區域性變數的區別Python變數
- 修改全域性變數時,可變型別和不可變型別的區別變數型別
- js宣告變數帶var和不帶var的區別JS變數
- Java 10新特性:型別推斷Java型別
- var、let、const宣告變數的區別變數
- 成員變數、全域性變數、例項變數、類變數、靜態變數和區域性變數的區別變數
- javascript中的作用域(全域性變數和區域性變數)JavaScript變數
- C#3.0新特性――隱含型別區域性變數和匿名型別C#型別變數
- 全域性變數與區域性變數變數
- 區域性變數和全域性變數變數
- 區域性變數和全域性變數(靜態和非靜態)區別變數
- C#隱式型別區域性變數經驗總結C#型別變數
- C語言區域性變數、全域性變數、靜態區域性變數、靜態全域性變數C語言變數
- 【Java貓說】例項變數與區域性變數Java變數
- JavaScript變數宣告帶var與不帶var區別JavaScript變數
- Java™ 教程(型別推斷)Java型別
- Python中的全域性變數和區域性變數Python變數
- js-js的全域性變數和區域性變數JS變數
- JavaScript —— 區域性變數和全域性變數JavaScript變數
- jmeter全域性變數和區域性變數JMeter變數
- 【c】全域性變數與區域性變數變數
- Python的區域性變數和全域性變數使用解惑Python變數
- Python的全域性和區域性變數Python變數
- python全域性變數與區域性變數Python變數
- 成員變數和區域性變數變數