關於lambda表達式,咱們已經知道了,通常是有兩部分組成。箭頭操做符(->)左側是lambda體的參數列表,右側是lambda體,而lambda體裏面的操做,有些狀況下能夠有另外一種寫法,更加簡短。
能夠理解這種寫法是lambda表達式的另一種表現形式,這種寫法咱們大體能夠分爲三類,方法引用、構造器引用、數組引用,通常語法格式爲X::Y,下面分別看一下。
1.對象::實例方法名java
/*** * 方法引用1 */ @Test public void test01() { String msg = "hello lambda!"; // lambda體中的功能已經有方法完成 能夠使用 方法引用 Consumer consumer = str -> System.out.println(msg); consumer.accept(msg); // PrintStream對象 PrintStream printStream = System.out; // 接口的方法 的參數列表和返回值類型 和 方法引用的 方法 參數列表和返回值類型保持一致 Consumer<String> consumer2 = printStream::println; consumer2.accept("hello lambda"); }
2.類::實例方法名數組
/*** * 方法引用2 */ @Test public void test01() { String msg = "hello lambda!"; // lambda體中的功能已經有方法完成 能夠使用 方法引用 Consumer consumer = str -> System.out.println(msg); consumer.accept(msg); // PrintStream對象 PrintStream printStream = System.out; // 接口的方法 的參數列表和返回值類型 和 方法引用的 方法 參數列表和返回值類型保持一致 Consumer<String> consumer2 = printStream::println; consumer2.accept("hello lambda"); }
3.類::實例方法名app
/*** * 方法引用3 * pow是Math類的方法 */ @Test public void test03() { // lambda 表達式以前的寫法 BinaryOperator<Double> binaryOperator = (x, y) -> Math.pow(x, y); System.out.println(binaryOperator.apply(2d, 3d)); // 接口的方法 的參數列表和返回值類型 和 方法引用的 方法 參數列表和返回值類型保持一致 BinaryOperator<Double> binaryOperator2 = (x, y) -> Math.pow(x, y); System.out.println(binaryOperator2.apply(2d, 3d)); }
與函數式接口相結合,自動與函數式接口中方法兼容。能夠把構造器引用賦值給定義的方法,與構造器參數 列表要與接口中抽象方法的參數列表一致,默認使用空的構造器
@Test public void test05() { // 獲取一個MyClass類型的實例 Supplier<MyClass> myClassSupplier=MyClass::new; // 獲取一個Object類型的實例 Supplier<Object> objectSupplier = Object::new; }
利用數組初始化一個Integer數組
@Test public void test06() { int size = 10; Function<Integer, Integer[]> function = (n) -> new Integer[n]; Integer[] integers = function.apply(size); }
當lambda體內的操做已經有方法實現了,這是的lambda體能夠採用方法引用這種方式書寫,代碼更緊湊簡潔,減小冗餘。 很重要的一點是:接口的方法的參數列表和返回值類型和方法引用的方法,參數列表和返回值類型保持一致
文章首發於黑貓のBlog歡迎來留言啊!!!函數