摘要:概述簡(jiǎn)介是一個(gè)匿名函數(shù),我們可以把表達(dá)式理解為是一段可以傳遞的代碼將代碼像數(shù)據(jù)一樣進(jìn)行傳遞。作為一種更緊湊的代碼風(fēng)格,使的語(yǔ)言表達(dá)能力得到了提升。任何滿(mǎn)足單一抽象方法法則的接口,都會(huì)被自動(dòng)視為函數(shù)接口。
1. 概述 1.1 簡(jiǎn)介
Lambda 是一個(gè)匿名函數(shù),我們可以把 Lambda 表達(dá)式理解為是一段可以傳遞的代碼(將代碼像數(shù)據(jù)一樣進(jìn)行傳遞)。可以寫(xiě)出更簡(jiǎn)潔、更靈活的代碼。作為一種更緊湊的代碼風(fēng)格,使 Java 的語(yǔ)言表達(dá)能力得到了提升。
1.2 為什么要使用 Lambda 表達(dá)式 1. 實(shí)例比如說(shuō)我們要為 TreeSet 添加一個(gè)比價(jià)器,如果用原來(lái)的匿名內(nèi)部類(lèi)實(shí)現(xiàn)如下
@Test public void test1() { Comparatorcom = new Comparator () { @Override public int compare(Integer o1, Integer o2) { return Integer.compare(o1, o2); } }; TreeSet ts = new TreeSet<>(com); TreeSet ts2 = new TreeSet<>(new Comparator () { @Override public int compare(Integer o1, Integer o2) { return Integer.compare(o1, o2); } }); ts2.addAll(Arrays.asList(4, 5, 7, 3, 2, 1, 8, 6, 9)); System.out.println(ts2.toString()); }
Lambda 表達(dá)式實(shí)現(xiàn)如下
@Test public void test2() { Comparator2. 實(shí)例com = (x, y) -> Integer.compare(x, y); TreeSet ts = new TreeSet<>(com); ts.addAll(Arrays.asList(4, 5, 7, 3, 2, 1, 8, 6, 9)); System.out.println(ts.toString()); }
對(duì)一個(gè) List 里面的對(duì)象進(jìn)行操作
實(shí)體類(lèi)
public class Employee implements Serializable { private int id; private String name; private int age; private double salary; // 省略 getter 和 setter 方法 }
基礎(chǔ)數(shù)據(jù)
Listemps = Arrays.asList( new Employee(1, "張三", 18, 9999.99), new Employee(2, "李四", 59, 6666.66), new Employee(3, "王五", 28, 3333.33), new Employee(4, "趙六", 8, 7777.77), new Employee(5, "田七", 38, 5555.55) );
我們有兩個(gè)需求,一個(gè)是“獲取公司中年齡小于 35 的員工信息”,一個(gè)是“獲取公司中工資大于 5000 的員工信息”
/** * 需求:獲取公司中年齡小于 35 的員工信息 * * @param emps * @return */ public ListfilterEmployeeAge(List emps) { List list = new ArrayList<>(); for (Employee emp : emps) { if (emp.getAge() <= 35) { list.add(emp); } } return list; } @Test public void test3() { List list = filterEmployeeAge(emps); for (Employee employee : list) { System.out.println(employee); } } /** * 需求:獲取公司中工資大于 5000 的員工信息 * * @param emps * @return */ public List filterEmployeeSalary(List emps) { List list = new ArrayList<>(); for (Employee emp : emps) { if (emp.getSalary() >= 5000) { list.add(emp); } } return list; }
這樣的話(huà)我要神隊(duì)每個(gè)需求都寫(xiě)個(gè)方法,如果再增加需求,還需要再寫(xiě)
定義一個(gè)接口
public interface MyPredicate{ public boolean test(T t); }
/** * 策略設(shè)計(jì)模式 * * @param emps * @param mp * @return */ public ListfilterEmployee(List emps, MyPredicate mp) { List list = new ArrayList<>(); for (Employee employee : emps) { if (mp.test(employee)) { list.add(employee); } } return list; } /** * 根據(jù)不同的需求實(shí)現(xiàn)不同的策略 */ @Test public void test4() { List list = filterEmployee(emps, new FilterEmployeeForAge()); for (Employee employee : list) { System.out.println(employee); } System.out.println("---------------------------------------"); List list2 = filterEmployee(emps, new FilterEmployeeForSalary()); for (Employee employee : list2) { System.out.println(employee); } }
/** * 匿名內(nèi)部類(lèi) */ @Test public void test5() { Listlist = filterEmployee(emps, new MyPredicate () { @Override public boolean test(Employee t) { return t.getId() <= 103; } }); for (Employee employee : list) { System.out.println(employee); } }
/** * Lambda 表達(dá)式 */ @Test public void test6() { Listlist = filterEmployee(emps, (e) -> e.getAge() <= 35); list.forEach(System.out::println); System.out.println("------------------------------------------"); List list2 = filterEmployee(emps, (e) -> e.getSalary() >= 5000); list2.forEach(System.out::println); }
/** * Stream API */ @Test public void test7() { emps.stream() .filter((e) -> e.getAge() <= 35) .forEach(System.out::println); System.out.println("----------------------------------------------"); emps.stream() .map(Employee::getName) .limit(3) .sorted() .forEach(System.out::println); }2. Lambda 表達(dá)式的基礎(chǔ)語(yǔ)法
Java8 中引入了一個(gè)新的操作符 -> 該操作符稱(chēng)為箭頭操作符或 Lambda 操作符,箭頭操作符將 Lambda 表達(dá)式拆分成兩部分:
左側(cè):Lambda 表達(dá)式的參數(shù)列表(即接口抽象方法的參數(shù)列表)
右側(cè):Lambda 表達(dá)式中所需執(zhí)行的功能, 即 Lambda 體(即接口的實(shí)現(xiàn))
Lambda 表達(dá)式需要“函數(shù)式接口”的支持
函數(shù)式接口:接口中只有一個(gè)抽象方法的接口,稱(chēng)為函數(shù)式接口??梢允褂米⒔?@FunctionalInterface 修飾,可以檢查是否是函數(shù)式接口
函數(shù)式接口可以有默認(rèn)方法和靜態(tài)方法。
任何滿(mǎn)足單一抽象方法法則的接口,都會(huì)被自動(dòng)視為函數(shù)接口。這包括 Runnable 和 Callable 等傳統(tǒng)接口,以及您自己構(gòu)建的自定義接口。
2.1 無(wú)參數(shù),無(wú)返回值() -> System.out.println("Hello Lambda!");1. 實(shí)例
@Test public void t1(){ Runnable r1 = () -> System.out.println("Hello Lambda!"); r1.run(); }2.2 有一個(gè)參數(shù),并且無(wú)返回值
(x) -> System.out.println(x)1. 實(shí)例
@Test public void t2(){ Consumer2. 實(shí)例con = (x) -> System.out.println(x); con.accept("Hello Lambda!"); }
如果只有一個(gè)參數(shù)的情況下小括號(hào)是可以省略的
@Test public void t3(){ Consumer2.3 有兩個(gè)以上的參數(shù),有返回值,并且 Lambda 體中有多條語(yǔ)句 1. 實(shí)例con = x -> System.out.println(x); con.accept("Hello Lambda!"); }
@Test public void t4() { Comparator2.4 若 Lambda 體中只有一條語(yǔ)句, return 和 大括號(hào)都可以省略不寫(xiě) 1. 實(shí)例com = (x, y) -> { System.out.println("函數(shù)式接口"); return Integer.compare(x, y); }; }
@Test public void t5(){ Comparatorcom = (x, y) -> Integer.compare(x, y); }
Lambda 表達(dá)式的參數(shù)列表的數(shù)據(jù)類(lèi)型可以省略不寫(xiě),因?yàn)镴VM編譯器通過(guò)上下文推斷出,數(shù)據(jù)類(lèi)型,即“類(lèi)型推斷”,如果寫(xiě)類(lèi)型的話(huà)如下
@Test public void t6(){ Comparatorcom = (Integer x,Integer y) -> Integer.compare(x, y); }
本文首發(fā)于凌風(fēng)博客:Java 8 新特性之Lambda表達(dá)式
作者:凌風(fēng)
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/72743.html
摘要:概述簡(jiǎn)介若體中的功能,已經(jīng)有方法提供了實(shí)現(xiàn),可以使用方法引用可以將方法引用理解為表達(dá)式的另外一種表現(xiàn)形式方法引用的三種形式對(duì)象的引用實(shí)例方法名類(lèi)名靜態(tài)方法名類(lèi)名實(shí)例方法名注意方法引用所引用的方法的參數(shù)列表與返回值類(lèi)型,需要與函數(shù)式接口中抽象 1. 概述 1.1 簡(jiǎn)介 若 Lambda 體中的功能,已經(jīng)有方法提供了實(shí)現(xiàn),可以使用方法引用(可以將方法引用理解為 Lambda 表達(dá)式的另外一...
摘要:表達(dá)式說(shuō)白了就是一種匿名方法,不需要方法名,修飾符,和返回值類(lèi)型。就目前而言表達(dá)式只能簡(jiǎn)化接口的匿名內(nèi)部類(lèi)實(shí)現(xiàn)。 Lambda表達(dá)式說(shuō)白了就是一種匿名方法,不需要方法名,修飾符,和返回值類(lèi)型。 使用方法 首先在moudle的build.gradle文件中添加配置:app/build.gradle添加。 android { ... defaultConfi...
摘要:歐陽(yáng)思海繼承接口后,又加了新的抽象方法,這個(gè)接口就不再是函數(shù)式接口默認(rèn)方法在接口中添加了一個(gè)默認(rèn)方法??偨Y(jié)在這篇文章中,我們講了表達(dá)式方法引用函數(shù)式接口接口中的靜態(tài)方法接口中的默認(rèn)方法的使用。 今天我來(lái)聊聊 Java8 的一些新的特性,確實(shí) Java8 的新特性的出現(xiàn),給開(kāi)發(fā)者帶來(lái)了非常大的便利,可能剛剛開(kāi)始的時(shí)候會(huì)有點(diǎn)不習(xí)慣的這種寫(xiě)法,但是,當(dāng)你真正的熟悉了之后,你一定會(huì)愛(ài)上這些新的...
摘要:在支持一類(lèi)函數(shù)的語(yǔ)言中,表達(dá)式的類(lèi)型將是函數(shù)。匿名函數(shù)的返回類(lèi)型與該主體表達(dá)式一致如果表達(dá)式的主體包含一條以上語(yǔ)句,則表達(dá)式必須包含在花括號(hào)中形成代碼塊。注意,使用表達(dá)式的方法不止一種。 摘要:此篇文章主要介紹 Java8 Lambda 表達(dá)式產(chǎn)生的背景和用法,以及 Lambda 表達(dá)式與匿名類(lèi)的不同等。本文系 OneAPM 工程師編譯整理。 Java 是一流的面向?qū)ο笳Z(yǔ)言,除了部分簡(jiǎn)...
摘要:大家好,我是樂(lè)字節(jié)的小樂(lè),上一次我們說(shuō)到了核心特性之函數(shù)式接口,接下來(lái)我們繼續(xù)了解又一核心特性方法引用。方法引用是一種更簡(jiǎn)潔易懂的表達(dá)式。感謝光臨閱讀小樂(lè)的,敬請(qǐng)關(guān)注樂(lè)字節(jié)后續(xù)將繼續(xù)講述等前沿知識(shí)技術(shù)。 大家好,我是樂(lè)字節(jié)的小樂(lè),上一次我們說(shuō)到了Java8核心特性之函數(shù)式接口,接下來(lái)我們繼續(xù)了解Java8又一核心特性——方法引用。 showImg(https://segmentfaul...
閱讀 1613·2021-11-23 09:51
閱讀 1184·2019-08-30 13:57
閱讀 2264·2019-08-29 13:12
閱讀 2018·2019-08-26 13:57
閱讀 1202·2019-08-26 11:32
閱讀 981·2019-08-23 15:08
閱讀 708·2019-08-23 14:42
閱讀 3089·2019-08-23 11:41