這篇文章將為大家詳細(xì)講解有關(guān)Java8新特性的lambda,函數(shù)式接口,StreamingAPI,小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。
成都創(chuàng)新互聯(lián)公司主營(yíng)平谷網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營(yíng)網(wǎng)站建設(shè)方案,成都app軟件開發(fā)公司,平谷h5小程序開發(fā)搭建,平谷網(wǎng)站營(yíng)銷推廣歡迎平谷等地區(qū)企業(yè)咨詢
Lambda表達(dá)式
1.是對(duì)匿名內(nèi)部類對(duì)象的一種格式的簡(jiǎn)化
2.Java8中引入了一個(gè)新的運(yùn)算符"->",稱為箭頭運(yùn)算符,或者lambda運(yùn)算符
3.作用就是分割前后兩部分的
4.左邊:表示的是Lambda表達(dá)式的參數(shù)列表(接口中,定義的抽象方法的參數(shù))
5.右邊:表示的是方法的方法體,Lambda體
語(yǔ)法格式的書寫
1.沒(méi)有參數(shù),也沒(méi)有返回值
左面的小括號(hào)不能省,右邊的大括號(hào)可以省略也可以不用省
2.有一個(gè)參數(shù),沒(méi)有返回值
有多個(gè)參數(shù),沒(méi)有返回值
左邊的括號(hào) 可省可不省,右邊的大括號(hào)可以省也可以不用省
3.接口中需要重寫的方法內(nèi)容有很多,需要給多句話的加上大括號(hào)
注意事項(xiàng):如果Lambda體中的語(yǔ)句有只有一句,那么大括號(hào)可以省略不寫;如果大擴(kuò)號(hào)中只有一條語(yǔ)句,并并且是return語(yǔ)句,那么return關(guān)鍵字可以省略不寫
函數(shù)式接口
Lambda表達(dá)式使用的前提,就是接口必須是函數(shù)式接口,如果在接口中,只有一個(gè)抽象方法,那么這個(gè)接口就是函數(shù)式接口,常用一個(gè)注解來(lái)檢查當(dāng)前接口是否是一個(gè)函數(shù)式接口@FunctionalInterface,如果不是函數(shù)式接口,則編譯報(bào)錯(cuò)
作用:
想表達(dá)的是一個(gè)方法的內(nèi)容,由于方法不在任何類中,所有被稱為函數(shù),接口其實(shí)想表達(dá)的就一個(gè)函數(shù)的聲明,接下來(lái)的使用這個(gè)接口的實(shí)現(xiàn)類對(duì)象,來(lái)表達(dá)一個(gè)函數(shù)的體現(xiàn)
消費(fèi)型接口:
抽象方法:void accept(T t)
當(dāng)某個(gè)函數(shù)可以接受一個(gè)數(shù)據(jù),并且處理這個(gè)數(shù)據(jù),處理完成之后,就不需要返回任何數(shù)據(jù),這個(gè)函數(shù)需要當(dāng)做數(shù)據(jù)來(lái)進(jìn)行傳遞,就使用消費(fèi)型接口
package cn.ujiuye.function; import java.util.function.Consumer; import cn.ujiuye.domin.Mobile; /** * @author liugang * 消費(fèi)型接口方式 */ public class CustmoerTest { public static void main(String[] args) { Mobile m = new Mobile("華為",3000); //lambad表達(dá)式實(shí)現(xiàn)賦值 內(nèi)部顯然是對(duì)消費(fèi)者接口的使用,故是對(duì)函數(shù)式接口編程的新東西 updateMobile(m, x -> x.setPrice(x.getPrice() + 1000 )); System.out.println(m); } //調(diào)用其使用的方法 private static void updateMobile(Mobile m, Consumercon) { for (int i = 0; i < 3; i++) { con.accept(m); } } }
方法引用
1.寫一個(gè)函數(shù)式接口時(shí),方法的實(shí)現(xiàn),已經(jīng)被某個(gè)其他的對(duì)象實(shí)現(xiàn)了,就不需要在Lambda中了,再次調(diào)用這個(gè)實(shí)現(xiàn),而可以那個(gè)直接定義好的方法了
2.格式
函數(shù)式接口: 名稱 = 對(duì)象名 :: 方法名稱
函數(shù)式接口: 名稱 = 類名::靜態(tài)方法名
3.作用
把已經(jīng)實(shí)現(xiàn)的當(dāng)做一個(gè)數(shù)據(jù),作為一個(gè)引用,賦值給某個(gè)函數(shù)式接口的引用,可以把這個(gè)引用當(dāng)做方法的返回值,也可以作為一個(gè)實(shí)現(xiàn)類對(duì)象
StreamingAPI
在jdk1.8中,提供了一個(gè)stream類型,可以很方便的操作容器中的數(shù)據(jù),不需要手動(dòng)定義循環(huán)就可以完成對(duì)數(shù)據(jù)的過(guò)濾,輸出及其其他的操作
Stream的類型的獲取和常用方法
Collection的獲?。?/p>
調(diào)用stream()方法,調(diào)回Stream對(duì)象
終止方法:foreach count
延遲方法:filter limit skip 等
package cn.ujiuye.stream; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.stream.Stream; /** * @author liugang * */ public class StreamApiDemo03Demo03 { public static void main(String[] args) { //定義一個(gè)集合,并獲取stream類型的數(shù)據(jù) Listlist = new ArrayList (); Collections.addAll(list, 12,32,-13,50,100); Stream stream = list.stream(); stream.forEach(x ->System.out.println(x - 100)); System.out.println(list.stream().count()); } } package cn.ujiuye.stream; import java.util.ArrayList; import java.util.Collections; import java.util.stream.Stream; /** * @author liugang * Stream中一些方法的使用 */ public class StreamApiDemo04 { public static void main(String[] args) { ArrayList list = new ArrayList<>(); Collections.addAll(list, -4,-12,-199,0,15,25,36,100); Stream stream = list.stream(); stream.filter(x -> x > 0) //過(guò)濾 .skip(1) //跳過(guò) .limit(2) //限制 .sorted((x,y) -> -1) //排序 .forEach(System.out::println); } }
練習(xí)
有兩個(gè)Arraylist集合,存儲(chǔ)隊(duì)伍中的多個(gè)成員姓名,使用Stream方式,對(duì)以下步驟進(jìn)行操作
1、第一個(gè)隊(duì)伍只要名字為3個(gè)字的成員姓名
2、第一個(gè)隊(duì)伍只要篩選之后的前三個(gè)人
3、第二個(gè)隊(duì)伍只要姓張的
4、第二個(gè)隊(duì)伍篩選之后不要前兩個(gè)人
5、將兩個(gè)隊(duì)伍合并成一個(gè)隊(duì)伍
6、合并之后的隊(duì)伍中的所有人的Person(自定義類型)對(duì)象,存儲(chǔ)到一個(gè)ArrayList集合中
隊(duì)伍1:宮本武藏、宋公明、蘇有朋、石頭人、時(shí)傳祥、李耳、莊子、洪七公
隊(duì)伍2:帕瓦羅蒂、張三瘋、趙薇薇、張自忠、孛兒只斤鐵木真、張?zhí)鞇?、張翠?/p>
public class StreamApiTest { @SuppressWarnings("unused") public static void main(String[] args) { //創(chuàng)建集合 Listlist1 = new ArrayList (); List list2 = new ArrayList (); //把元素添加到集合中 Collections.addAll(list1, "宮本武藏","宋公明","蘇有朋","石頭人","時(shí)傳祥","李耳","莊子","洪七公"); Collections.addAll(list2, "帕瓦羅蒂","張三瘋","趙薇薇","張自忠","孛兒只斤鐵木真","張?zhí)鞇?,"張翠花"); //創(chuàng)建Stream對(duì)象 Stream stream1 = list1.stream(); Stream stream2 = list2.stream(); //創(chuàng)建篩選后的元素 Stream limit1 = stream1.filter(x -> x.length() == 3).limit(3); Stream limit2 = stream2.filter(x -> x.startsWith("張")).skip(2); //將兩對(duì)的人合到同一個(gè)對(duì)里 Stream concat = Stream.concat(limit1, limit2); //定義一個(gè)集合用來(lái)存對(duì)象 List list = new ArrayList (); //想要的是一個(gè)Person對(duì)象的流 //Stream map = concat.map(x -> new Person(x); Stream map = concat.map(Person::new); //將流對(duì)象添加到集合中 map.forEach(list::add); System.out.println(list); } }
關(guān)于Java8新特性的lambda,函數(shù)式接口,StreamingAPI就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到。