你知道Java的這些騷操作嗎?
一、try with catch
還記得這樣的代碼嗎?我們需要手動的關閉資源的流,不然會造成資源泄漏,因為虛擬機無法管理系統資源的關閉,必須手動釋放。
public void manualClose(String fileName) { BufferedReader reader = null; try { String line; reader = new BufferedReader(new FileReader(fileName)); while ((line = reader.readLine()) != null) { ... } } catch (Exception e) { ... } finally { if (reader != null) { try { reader.close(); } catch (IOException e) { ... } } } }
騷操作解救你:
public void autoClose(String fileName) { try (BufferedReader reader = new BufferedReader(new FileReader(fileName))) { String line; while ((line = reader.readLine()) != null) { ... } } catch (Exception e) { ... } }
可以看到,try-with-resources的比前一種方法明顯節省瞭很多代碼,資源在try後邊的()中生成,在try結束後程序會自動關閉資源。
如果需要聲明多個資源,可以在try後面的()中,以;分隔;也就是說,try後邊的()可以添加多行語句, 我上篇文章有展示:你肯定能看懂的Java IO相關知識總結
二、instance of
對象是否是這個特定類或者是它的子類的一個實例,返回一個佈爾值。左邊是對象,右邊是類;當對象是右邊類或子類所創建對象時,返回true;否則,返回false。
用法: result = object instanceof class 參數: Result:佈爾類型。 Object:必選項。任意對象表達式。 Class:必選項。任意已定義的對象類。 public interface Monster { } public static class Dinosaur implements Monster{ } public static void main(String[] args) { Dinosaur dinosaur = new Dinosaur(); System.out.println(dinosaur instanceof Monster); }
三、不定項參數 …
格式如下:
參數個數可以0或者多個
public void method(int...args);
業務場景:
1、在業務開發的時候經常之前寫一個方法,但是後來業務變動瞭,需要增加參數,這個時候可以使用這種方式,多傳參數,調用的地方不需要覆蓋
2、如果一個方法的的不確定參數個數的情況,通常來說我們會重載,但是如果多瞭很麻煩,這個時候…可以出場瞭
//方法重載,解決參數個數不確定問題 public void method(){}; public void method(int i){}; public void method(int i, int j){}; public void method(int i, int j, int k){}; 優化之後的形式: public void method(int i,int ...args);
調用的三種方式
public void call(){ //1、 不使用變參 method(1); //2、 直接調用 method(1,2,23,4,5,6); //3、 數組調用 int[] arr = {1,2,23,4,5,6}; method(5,arr); }
四、跳出多層循環的label
Java 中的標簽是為循環設計的,是為瞭在多重循環中方便的使用 break 和coutinue ,當在循環中使用 break 或 continue 循環時跳到指定的標簽處
public static void main(String[] args) { for (int i = 0; i < 5; i++) { labelA: for (int j = 0; j < 5; j++) { for (int k = 0; k < 5; k++) { if (k == 1) { break labelA; } System.out.println(1); } } } }
不推薦這種用法,雖然很騷,但是老老實實的一層一層break 比較好,你覺得吶?
五、方法引用
用Lambda表達式僅僅是調用一些已經存在的方法,除瞭調用動作外,沒有其他任何多餘的動作
package org.pdool; import java.util.ArrayList; import java.util.List; /** * 方法引用測試類 * @author 香菜 */ public class Trytest { static List<Player> playerList = new ArrayList<>(); // 靜態方法 public static void print(String s) { System.out.println(s); } static class Player { private String name; public Player(String name) { this.name = name; playerList.add(this); } private void printName() { System.out.println(name); } } public static void main(String[] args) { List<String> strList = new ArrayList<>(); strList.add("香菜"); strList.add("follow me"); // 1、靜態方法引用 strList.forEach(Trytest::print); // /2、對象方法引用 strList.forEach(System.out::println); // 3、構造函數 strList.forEach(Player::new); // 4、對象方法 playerList.forEach(Player::printName); } }
總結
1、在try結束後程序會自動關閉資源
2、instance of 必須是子類
3、參數個數可以0或者多個,重構代碼利器
4、使用 break 或 continue 循環時跳到指定的標簽處
5、方法調用是除瞭調用動作外,沒有其他任何多餘的動作
到此這篇關於你知道Java的這些騷操作嗎?的文章就介紹到這瞭,更多相關Java騷操作內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- 使用BufferedReader讀取TXT文件中數值,並輸出最大值
- Java異常類型及處理
- java基礎檢查和未檢查異常處理詳解
- 解決BufferedReader.readLine()遇見的坑
- Java的File類和IO流其實真的不難