W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
Lambda 表達式,也可稱為閉包,它是推動 Java 8 發(fā)布的最重要新特性。
Lambda 允許把函數(shù)作為一個方法的參數(shù)(函數(shù)作為參數(shù)傳遞進方法中)。
使用 Lambda 表達式可以使代碼變的更加簡潔緊湊。
lambda 表達式的語法格式如下:
(parameters) -> expression
或
(parameters) ->{ statements; }
以下是lambda表達式的重要特征:
示例:
//入?yún)榭?TestDemo no_param = () -> "hi, no param"; TestDemo no_param2 = () -> { return "hi, no param"; }; System.out.println(no_param.hi()); //單個參數(shù) TestDemo2 param = name -> name; TestDemo2 param2 = name -> { return name;}; System.out.println(param.hei("hei, grils")); //多個參數(shù) TestDemo3 multiple = (String hello, String name) -> hello + " " + name; //一條返回語句,可以省略大括號和return TestDemo3 multiple2 = (hello, name) -> hello + name; //多條處理語句,需要大括號和return TestDemo3 multiple3 = (hello, name) -> { System.out.println("進入內(nèi)部"); return hello + name; }; System.out.println(multiple.greet("hello", "lambda"));
有以下幾種類型
objectName::instanceMethod
示例:
Consumer<String> sc = System.out::println; //等效 Consumer<String> sc2 = (x) -> System.out.println(x); sc.accept("618, 狂歡happy");
ClassName::staticMethod
//ClassName::staticMethod 類的靜態(tài)方法:把表達式的參數(shù)值作為staticMethod方法的參數(shù) Function<Integer, String> sf = String::valueOf; //等效 Function<Integer, String> sf2 = (x) -> String.valueOf(x); String apply1 = sf.apply(61888);
ClassName::instanceMethod
//ClassName::instanceMethod 類的實例方法:把表達式的第一個參數(shù)當成instanceMethod的調(diào)用者,其他參數(shù)作為該方法的參數(shù) BiPredicate<String, String> sbp = String::equals; //等效 BiPredicate<String, String> sbp2 = (x, y) -> x.equals(y); boolean test = sbp.test("a", "A");
無參的構(gòu)造方法就是類::實例方法模型,如:
Supplier<User> us = User::new; //等效 Supplier<User> us2 = () -> new User(); //獲取對象 User user = us.get();
當有參數(shù)時:
//一個參數(shù),參數(shù)類型不同則會編譯出錯 Function<Integer, User> uf = id -> new User(id); //或加括號 Function<Integer, User> uf2 = (id) -> new User(id); //等效 Function<Integer, User> uf3 = (Integer id) -> new User(id); User apply = uf.apply(61888); //兩個參數(shù) BiFunction<Integer, String, User> ubf = (id, name) -> new User(id, name); User 狂歡happy = ubf.apply(618, "狂歡happy");
public interface A { String hi(); String greet(); default void hello() { System.out.println("A.hello"); } }
public interface B { String hi(); String hh(); default void hello() { System.out.println("B.hello"); } }
public class C implements A, B{ @Override public String hi() { return "C.hi"; } @Override public String greet() { return "C.greet"; } @Override public String hh() { return "C.hh"; } /** * 子類優(yōu)先繼承父類的方法, 如果父類沒有相同簽名的方法,才繼承接口的默認方法。 * 編譯報錯解決1:覆蓋法 */ @Override public void hello() { System.out.println("C.hello"); } /** * 編譯報錯解決2:指定實現(xiàn)的父接口 */ // @Override // public void hello() { // A.super.hello(); //// B.super.hello(); // } }
此時若不處理hello方法時,類C將編譯出錯,解決方式要么覆蓋,要么指定實現(xiàn)父接口的該方法。
進一步測試繼承具有相同方法的父類:
public class D { public void hello() { System.out.println("D.hello"); } }
public class C extends D implements A, B{ @Override public String hi() { return "C.hi"; } @Override public String greet() { return "C.greet"; } @Override public String hh() { return "C.hh"; } }
此時若不覆蓋或指定父接口的方法時,類C將繼承類D的hello方法。
java8 引入 lambda 表達式是接收了函數(shù)式編程語言的思想,例如 scala 之類的,它將函數(shù)視為一等公民,可以使用高階函數(shù)等。
和指令式編程相比,函數(shù)式編程強調(diào)函數(shù)的計算比指令的執(zhí)行重要。
和過程化編程相比,函數(shù)式編程里函數(shù)的計算可隨時調(diào)用。寫在最后,lambda 表達式可以使代碼看起來簡潔,但一定程度上增加了代碼的可讀性以及調(diào)試的復(fù)雜性,所以在使用時應(yīng)盡量是團隊都熟悉使用,要么干脆就別用,不然維護起來是件較痛苦的事。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: