您好,登錄后才能下訂單哦!
今天就跟大家聊聊有關Java8中函數式接口與Lambda表達式的特性,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。
什么是Lambda表達式,java8為什么使用Lambda表達式?
“Lambda 表達式”(lambda expression)是一個匿名函數,Lambda表達式基于數學中的λ演算得名,直接對應于其中的lambda抽象(lambda abstraction),是一個匿名函數,即沒有函數名的函數。我們可以把 Lambda表達式理解為是 一段可以傳遞的代碼。最直觀的是使用Lambda表達式之后不用再寫大量的匿名內部類,簡化代碼,提高了代碼的可讀性。
// 啟動一個線程,不使用Lambda表達式 new Thread(new Runnable() { @Override public void run() { System.out.println("啟動一個線程"); } }).start(); //使用Lambda表達式,只需要一行代碼 new Thread(() -> System.out.println("啟動一個線程")).start();
Lambda表達式的基本語法和格式
基本語法
java8中引入了新的操作符”->”,稱為箭頭操作符或者lambda操作符,箭頭操作符將lambda拆分為兩部分,左側:lambda表達式的參數列表,右側:lambda表達式中的所需要執行的的功能(接口實現的功能代碼)。
lambda表達式需要“函數式接口”的支持,接口中只有一個抽象方法的接口稱為函數式接口,可以使用注解@FunctionalInterface檢查接口是否是函數式接口。
lambda表達式的參數列表的數據類型可以省略不寫,因為jvm編輯器可以通過上下文判斷。
基本格式
① 無參數,無返回值。( ) -> System.out.println(“hello”)
// 實現Runnable接口(無參,無返回) Runnable r = () -> System.out.println("hello lambda");
② 一個參數(小括號可以省略不寫,習慣上加上小括號),無返回值。(x) -> System.out.println(x)
//Consumer接口(一個參數,無返回值),之后會提到 //第一種,小括號不省略 Consumer<String> c = (x) -> System.out.print(x); c.accept("hello"); //小括號省略 Consumer<String> c1 = x -> System.out.print(x); c1.accept("hello")
③ 有多個參數,并且lambda有多條語句,則lambda語句必須用大括號括起來并有return返回(若有一條語句則可以省略大括號和return),有返回值。(x,y) ->{System.out.println(“hello”);return Integer.compare(x, y);};
//Comparator接口 //多條語句 Comparator<Integer> comparator = (x,y) ->{ System.out.println("hello"); return Integer.compare(x, y); }; //一條語句 Comparator<Integer> comparator2 = (x,y) -> Integer.compare(x, y); System.out.println(comparator2.compare(23, 22));
還有其他的一些格式都是大同小異,這里就不再了解。
函數式接口是什么?
在前面也提到了函數接口,那么函數接口到底是什么呢?是個接口,只包含一個抽象方法,那么它就是函數式接口,我們可以在任意函數式接口上使用 @FunctionalInterface 檢查它是否是一個函數式接口。
函數式接口里是可以包含默認方法、靜態方法,他們不是抽象方法;也可以包含Java.lang.Object里的public方法,因為任何一個類都繼承Object類,包含了來自java.lang.Object里對這些抽象方法的實現,也不屬于抽象方法;函數式接口里允許子接口繼承多個父接口,但每個父接口中都只能存在一個抽象方法,且必須的相同的抽象方法。
Java8內置函數式接口
四大核心函數式接口
函數式接口 | 方法 | 參數類型 | 返回類型 | 作用 |
---|---|---|---|---|
Consumer<T> 消費型接口 | void accept(T t) | T | void | 對T類型的參數進行操作 |
Supplier<T> 供給型接口 | T get() | 無 | T | 操作數據,返回T類型的結果 |
Function<T, R> 函數型接口 | R apply(T t) | T | R | 對T類型參數進行操作,并返回R類型的結果 |
Predicate<T> 斷定型接口 | boolean test(T t) | T | boolean | 確定T類型參數是否滿足某約束,并返回boolean值 |
//Consumer<T> 消費型接口 @Test public void test1(){ Consumer<String> c = (x) -> System.out.println("hello:"+x+"!"); c.accept("Java"); } // Supplier<T> 供給型接口 @Test public void test2(){ Supplier<String> s = () -> "hello,beautiful girl"; String str = s.get(); System.out.println(str); } //Function<T,R> 函數性接口 @Test public void test3(){ Function<String, Integer> f= (x) -> x.length(); Integer len = f.apply("hello"); System.out.println(len); } //Predicate<T> 斷言型接口 @Test public void test4(){ Predicate<String> p = (x) -> x.length()>5; boolean b = p.test("hello Java"); System.out.println(b); }
其它函數式接口
函數式接口 | 方法 | 參數類型 | 返回類型 | 作用 |
---|---|---|---|---|
BiFunction<T , U, R > | R apply(T t, U u) | T, U | R | 對 T, U 類型的參數進行操作,并返回R類型的結果 |
UnaryOperator<T> (Function 子接口) | T apply(T t) | T | T | 對 T類型的參數進行一元運算,并返回R對象的結果 |
BinaryOperato<T,R> (BiFunction 子接口) ) | T apply(T t1, T t2 | T, T | T | 對T類型的參數進行二元運算,并返回T類型的結果 |
BiConsumer<T, U> | void accept(T t, U u) | T, U | void | 對T,作 |
ToIntToIntFunction<T> ToLongFunction<T> ToDoubleFunction<T> | int(long,double) applyAsInt(T value) | T | int, long, double | 計 算 int 、 long 、double值的函數 |
IntFunction<R> LongFunction<R> DoubleFunction<R> | R apply(int(long,double) value) | int, long, double | R | 參數分別為int、long、double 類型的函數 |
看完上述內容,你們對Java8中函數式接口與Lambda表達式的特性有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業資訊頻道,感謝大家的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。