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