摘要:的參數(shù)和返回值需求使用數(shù)組存儲(chǔ)多個(gè)對(duì)象對(duì)數(shù)組中的對(duì)象使用的方法通過年齡進(jìn)行升序排序下面舉例演示接口的使用場(chǎng)景代碼,其中的抽象方法定義為當(dāng)需要對(duì)一個(gè)對(duì)象數(shù)組進(jìn)行排序時(shí),方法需要一個(gè)接口實(shí)例來指定排序的規(guī)則。
3.8 Lambda的參數(shù)和返回值
需求: 使用數(shù)組存儲(chǔ)多個(gè)Person對(duì)象 對(duì)數(shù)組中的Person對(duì)象使用Arrays的sort方法通過年齡進(jìn)行升序排序
下面舉例演示java.util.Comparator
public abstract int compare(T o1, T o2);
當(dāng)需要對(duì)一個(gè)對(duì)象數(shù)組進(jìn)行排序時(shí),Arrays.sort方法需要一個(gè)Comparator接口實(shí)例來指定排序的規(guī)則。假設(shè)有一個(gè)Person類,含有String name和int age兩個(gè)成員變量:
public class Person { private String name; private int age; // 省略構(gòu)造器、toString方法與Getter Setter }傳統(tǒng)寫法
如果使用傳統(tǒng)的代碼對(duì)Person[]數(shù)組進(jìn)行排序,寫法如下:
import java.util.Arrays; import java.util.Comparator; public class Demo06Comparator { public static void main(String[] args) { // 本來年齡亂序的對(duì)象數(shù)組 Person[] array = { new Person("古力娜扎", 19), new Person("迪麗熱巴", 18), new Person("馬爾扎哈", 20) }; // 匿名內(nèi)部類 Comparatorcomp = new Comparator () { @Override public int compare(Person o1, Person o2) { return o1.getAge() - o2.getAge(); } }; Arrays.sort(array, comp); // 第二個(gè)參數(shù)為排序規(guī)則,即Comparator接口實(shí)例 for (Person person : array) { System.out.println(person); } } }
這種做法在面向?qū)ο蟮乃枷胫?,似乎也是“理所?dāng)然”的。其中Comparator接口的實(shí)例(使用了匿名內(nèi)部類)代表了“按照年齡從小到大”的排序規(guī)則。
代碼分析下面我們來搞清楚上述代碼真正要做什么事情。
為了排序,Arrays.sort方法需要排序規(guī)則,即Comparator接口的實(shí)例,抽象方法compare是關(guān)鍵;
為了指定compare的方法體,不得不需要Comparator接口的實(shí)現(xiàn)類;
為了省去定義一個(gè)ComparatorImpl實(shí)現(xiàn)類的麻煩,不得不使用匿名內(nèi)部類;
必須覆蓋重寫抽象compare方法,所以方法名稱、方法參數(shù)、方法返回值不得不再寫一遍,且不能寫錯(cuò);
實(shí)際上,只有參數(shù)和方法體才是關(guān)鍵。
Lambda寫法import java.util.Arrays; public class Demo07ComparatorLambda { public static void main(String[] args) { Person[] array = { new Person("古力娜扎", 19), new Person("迪麗熱巴", 18), new Person("馬爾扎哈", 20) }; Arrays.sort(array, (Person a, Person b) -> { return a.getAge() - b.getAge(); }); for (Person person : array) { System.out.println(person); } } }
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/75993.html
摘要:使用表達(dá)式,使得應(yīng)用變得簡(jiǎn)潔而緊湊。很多語言等從設(shè)計(jì)之初就支持表達(dá)式。表達(dá)式的參數(shù)與函數(shù)式接口內(nèi)方法的參數(shù),返回值類型相互對(duì)應(yīng)。更多教程和資料請(qǐng)上騰訊課堂樂字節(jié) showImg(https://segmentfault.com/img/bVbtotg?w=935&h=345); Java8 引入Lambda表達(dá)式,允許開發(fā)者將函數(shù)當(dāng)成參數(shù)傳遞給某個(gè)方法,或者把代碼本身當(dāng)作數(shù)據(jù)進(jìn)行處理。...
摘要:本文是函數(shù)式編程第二章的讀書筆記。的語法簡(jiǎn)化了使用匿名內(nèi)部類時(shí)的模板代碼,讓程序員專注于編寫想要執(zhí)行的行為,也讓代碼更加簡(jiǎn)潔易讀。中最重要的函數(shù)接口類型推斷為新成員表達(dá)式提供了類型推斷的支持,在不需要聲明參數(shù)類型的表達(dá)式中表現(xiàn)的有為明顯。 本文是「Java 8 函數(shù)式編程」第二章的讀書筆記。 Lambda引入的變化 Lambda表達(dá)式,是一種緊湊的、傳遞行為的方式,從編程思想上來講,...
摘要:很多語言等從設(shè)計(jì)之初就支持表達(dá)式。注意此時(shí)外部局部變量將自動(dòng)變?yōu)樽鳛榉椒ǚ祷刂道臃祷嘏袛嘧址欠駷榭张袛嘧址欠駷榭战裉礻P(guān)于新特性表達(dá)式就講到這里了,接下來我會(huì)繼續(xù)講述新特性之函數(shù)式接口。 上一篇文章我們了解了Java8新特性-接口默認(rèn)方法,接下來我們聊一聊Java8新特性之Lambda表達(dá)式。 Lambda表達(dá)式(也稱為閉包),它允許我們將函數(shù)當(dāng)成參數(shù)傳遞給某個(gè)方法,或者把代碼...
摘要:表達(dá)式有參數(shù)有返回值的練習(xí)需求給定一個(gè)計(jì)算器接口,內(nèi)含抽象方法可以將兩個(gè)數(shù)字相加得到和值使用的標(biāo)準(zhǔn)格式調(diào)用方法,完成和的相加計(jì)算調(diào)用方法方法的參數(shù)是一個(gè)接口可以使用匿名內(nèi)部類使用表達(dá)式簡(jiǎn)化匿名內(nèi)部類的書寫優(yōu)化省略定義一個(gè)方法參數(shù)傳遞兩個(gè) package com.itheima.demo06.Lambda; /* Lambda表達(dá)式有參數(shù)有返回值的練習(xí) 需求: 給定一個(gè)計(jì)算器Ca...
摘要:上下文比如接受它傳遞的方法的參數(shù),或接受它的值的局部變量中表達(dá)式需要的類型稱為目標(biāo)類型。但局部變量必須顯式聲明為,或事實(shí)上是。換句話說,表達(dá)式只能捕獲指派給它們的局部變量一次。注捕獲實(shí)例變量可以被看作捕獲最終局部變量。 簡(jiǎn)介 概念 Lambda 表達(dá)式可以理解為簡(jiǎn)潔地表示可傳遞的匿名函數(shù)的一種方式:它沒有名稱,但它有參數(shù)列表、函數(shù)主體、返回類型,可能還有一個(gè)可以拋出的異常列表。 匿名...
摘要:語言是強(qiáng)類型面向?qū)ο蟮恼Z言,所以必須提供一種數(shù)據(jù)類型作為表達(dá)式的返回值類型符合中函數(shù)格式的定義符合面向?qū)ο笠?guī)則,所以最終表達(dá)式要有一個(gè)映射成對(duì)象的過程。定一個(gè)函數(shù)式接口我們?cè)诮涌诶锒x了一個(gè)沒有參數(shù)返回值的抽象方法。 在JAVA中,Lambda 表達(dá)式(Lambda expression)是一個(gè)抽象方法的實(shí)現(xiàn)。這個(gè)抽象方法必須是在接口中聲明的,而且實(shí)現(xiàn)類只需要實(shí)現(xiàn)這一個(gè)抽象方法,我們稱...
閱讀 1462·2019-08-30 15:44
閱讀 1521·2019-08-29 18:42
閱讀 556·2019-08-29 13:59
閱讀 930·2019-08-28 17:58
閱讀 2938·2019-08-26 12:02
閱讀 2514·2019-08-23 18:40
閱讀 2506·2019-08-23 18:13
閱讀 3210·2019-08-23 16:27