你知道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!

推薦閱讀: