java複習第10天---10.2---Java8新特性---常用函數式接口1

java複習第10天---10.2---常用函數式接口1


目錄




內容

1、函數式接口作爲參數和返回值

  如果拋開實現原理不說,Java中的Lambda表達式可以被當做是匿名內部類的替代品。如果方法的參數是一個函數式接口類型,那麼就可以用Lambda表達式進行替代。

1.1、使用Lambda表達式作爲方法參數

  使用Lambda表達式作爲方法參數,其實就是使用函數式接口作爲參數。

  • 示例1-1:java.lang.Runnable接口作爲函數式接口

      package feature.jdk8.lambda;
    
      public class TestLambdaPara1 {
      	public static void main(String[] args) {
      		startThread(() -> System.out.println("線程任務執行"));
      	}
      	// 開啓線程,執行任務
      	private static void startThread(Runnable task) {
      		new Thread(task).start();
      	}
      }
      測試結果:
      線程任務執行
    

1.2、使用函數式接口作爲返回值類型

  使用函數式接口作爲返回值類,可以直接返回一個Lambda表達式。

  • 示例1.2-1:通過方法獲取一個java.util.Comparator接口類型的對象作爲排序器

  • 需求:給定一個字符串數組,按照字符串長度降序排序

      package feature.jdk8.lambda;
    
      import java.util.Arrays;
      import java.util.Comparator;
    
      public class TestLambdaAsReturnType {
      	public static void main(String[] args) {
      		String[] str = {"Hello", "Java", "C++", "Python", "World"};
      		System.out.println("排序前:" + Arrays.toString(str));
      		Arrays.sort(str, getComparator());
      		System.out.println("排序後:" + Arrays.toString(str));
    
      	}
    
      	// 排序器:按字符串長度降序排列
      	private static Comparator<String> getComparator() {
      		return (String s1, String s2) -> s2.length() - s1.length();
      	}
      }
      測試結果:
      排序前:[Hello, Java, C++, Python, World]
      排序後:[Python, Hello, World, Java, C++]
    

2、Supplier

  java.util.Supplier<T> 接口僅包含一個無參的方法:T get()。用來獲取一個泛型參數指定類型的對象數據。由於這是一個函數式接口,那麼可以使用Lambda表達式對外提供一個符合泛型類型的對象數據。
  Supplier也被稱爲生產型接口,指定接口的泛型是什麼類型,就返回什麼類型的數據對象。

  • 示例2-1:

      package feature.jdk8.functionalinterface;
    
      import java.util.function.Supplier;
    
      public class TestSupplier1 {
      	public static void main(String[] args) {
      		String s1 = "Hello", s2 = "World";
      		System.out.println(stringConnect(() -> s1 +s2));
      	}
    
      	public static String stringConnect(Supplier<String> str) {
      		return str.get();
      	}
      }
      測試結果:
      HelloWorld
    

3、Consumer

  java.util.Consumer<T>接口正好與Supplier接口相反,他不是生產一個數據,而是消費一個數據,數據類型由泛型決定。

3.1、accept

  • 抽象方法:
修飾符 返回值類型 方法 參數列表 描述
public abstract void accept T t 消費一個指定的泛型數據
  • 示例3-1:字符串反序輸出

      package feature.jdk8.functionalinterface;
    
      import java.util.function.Consumer;
    
      public class TestConsumer1 {
      	public static void main(String[] args) {
      		consumerString("Hello", s -> System.out.println(new StringBuilder(s).reverse()));
      	}
    
      	public static void consumerString(String str, Consumer<String> con) {
      		con.accept(str);
      	}
      }
    
      測試結果:
      olleH
    
  • 解析:

    • Consumer接口使用accept方法消費泛型指定的數據類型,至於怎麼消費,自己定義

3.2、andThen

  andThen爲Comsumer接口中的默認方法

  • 作用:消費數據的時候,先執行一個操作,在執行另外一個操作,實現組合效果,但是2個操作不好相互干擾。

  • 注意:函數式接口不限制默認方法和靜態方法。

  • 示例3.2-1:吧字符串全部大寫輸出然後全部小寫輸出

      package feature.jdk8.functionalinterface;
    
      import java.util.function.Consumer;
    
      public class TestConsumerAndThen {
      	public static void main(String[] args) {
      		method("Hello", s -> System.out.println(s.toUpperCase()), s -> System.out.println(s.toLowerCase()));
      	}
    
      	public static void method(String s, Consumer<String> con1, Consumer<String> con2) {
      		con1.andThen(con2).accept(s);
      	}
      }
      測試結果:
      HELLO
      hello
    

後記

本項目爲參考某馬視頻開發,相關視頻及配套資料可自行度娘或者聯繫本人。上面爲自己編寫的開發文檔,持續更新。歡迎交流,本人QQ:806797785

前端項目源代碼地址:https://gitee.com/gaogzhen/vue-leyou
    後端JAVA源代碼地址:https://gitee.com/gaogzhen/JAVA

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章