java8中l(wèi)amba表達(dá)式的使用
(-1)前言
學(xué)習(xí)lamba表達(dá)式是十分重要的,你會發(fā)現(xiàn)java變的可愛多了。
(0)函數(shù)式接口
只有一個(gè)方法的接口稱為函數(shù)式接口
JButton jButton = new JButton("123"); jButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) {}});
等同于
jButton.addActionListener(e->System.out.println("Hello world")); jButton.addActionListener((e)->System.out.println("Hello world")); jButton.addActionListener((ActionEvent e)->System.out.println("Hello world")); jButton.addActionListener((ActionEvent e)->{System.out.println("Hello world");return;});
a.規(guī)則
A->B
A 部分是傳入方法的參數(shù)
B 部分是函數(shù)體
參數(shù)類型以及返回類型如果可以通過上下文推斷出來可不寫
當(dāng)參數(shù)只有一個(gè)而且它的類型可以被推導(dǎo)得知時(shí),該參數(shù)列表外面的括號可以被省略
當(dāng)函數(shù)體只有一個(gè)語句且返回類型可被推導(dǎo)時(shí){}可省略
b.例子
Runnable runnable = ()->System.out.println(sign); Runnable runnable2 = new Runnable() { @Override public void run() { // TODO Auto-generated method stub} }; 通過匿名內(nèi)部類我們知道run方法是不需要參數(shù)的 System.out.println(sign) 相當(dāng)于run方法的方法體 Comparator<Integer> lol = (x,y)->x-y; Comparator<Integer> lol = (x,y)->{System.out.println(x+y);return x-y;}; new Comparator<Integer>() { @Override public int compare(Integer o1, Integer o2) { // TODO Auto-generated method stub return 0; } };
通過匿名內(nèi)部類我們知道compare方法需要兩個(gè)參數(shù)
這時(shí)編譯通過Comparator<Integer>中Integer推導(dǎo)出參宿類型及返回類型
c.深入
lamba表達(dá)式可被看做函數(shù),java.util.function定義了常用的函數(shù)式接口
http://docs.oracle.com/javase/8/docs/api/java/util/function/package-summary.html
BiFunction<T,U,R>
T 代表第一個(gè)參數(shù)
U 代表第二個(gè)參數(shù)
R 代表返回值
這表時(shí)T,U,R都需要編譯器根據(jù)上下文進(jìn)行類型推導(dǎo)
Consumer<T> 代表e->System.out.println("Hello world")
所以當(dāng)一個(gè)方法需要的是lamba表達(dá)式時(shí),參數(shù)展現(xiàn)形式是java.util.function中定義的樣式
(2)方法引用
方法引用是對Lamba表達(dá)式的簡化
類名::方法名(對象方法、類方法)
int[] oop = {3,1,2,1}; static void sayHello(Integer name) { System.out.println(123); } Arrays.stream(oop).forEach(Test::sayHello); Arrays.stream(oop).forEach(s->Test.sayHello(s));
構(gòu)造方法引用:Class::new
數(shù)組構(gòu)造方法引用:TypeName[]::new
(3)強(qiáng)制類型轉(zhuǎn)換
有時(shí)候編譯器通過上下文推導(dǎo)出的返回類型與實(shí)際類型不符時(shí)需要進(jìn)類型轉(zhuǎn)換
Stream<Object> strings = shapelist.stream().<Object>map(s->s.getColor()); s.getColor())
s.getColor()返回的是String
(4)lamba表達(dá)式在java對象中的應(yīng)用
你應(yīng)該在任何java對象中嘗試應(yīng)用lamba表達(dá)式,通則是將這個(gè)對象轉(zhuǎn)換成java.util.stream,流有串行并行之分哦!并行流關(guān)鍵字parallelStream
數(shù)組 Arrays.stream()
List、Set .stream()
String String.chars
...
java.util.stream提供了許多方法用來操作流中的數(shù)據(jù),去試一試吧
http://docs.oracle.com/javase/8/docs/api/
java 8英文API,沒有找到中文的...
(2)對流整體的操作
比如我們可以求一個(gè)流的的總和
int sum = Arrays.stream(oop).sum(); int sum1 = Arrays.stream(oop).reduce(0,(x,y)->x+y);
(3)集合之間的轉(zhuǎn)換
我們可以將ArrayList<Shape> 轉(zhuǎn)換成ArrayList<String>、Set<String>、HashMap<String,String>,HashMap<String,Shape>甚至是更復(fù)雜的
a.map()
該方法是映射的意思(一開始我聯(lián)想到了HashMap),還有mapToDouble等
b.collect()
collect()接受Collectors類型的參數(shù),用來將流重新匯合,
Collectors是收集器,Collectors.toList(),Collectors.toMap()、Collectors.groupingBy等
c.例子
public class Shape { private String color; public Shape() { // TODO Auto-generated constructor stub } public String getColor() { return color; } public void setColor(String color) { this.color = color; } public Shape(String color) { this.color = color; } } ArrayList<String> colorList = new ArrayList<String>(){ { add("Red"); add("Blue"); add("Yellow"); } }; List<Shape> shapeList = colorList.stream().map(Shape::new).collect(Collectors.toList()); List<String> colos = shpaeList.stream().map(s->s.getColor()).collect(Collectors.toList()); Set<String> colosSet = shpaeList.stream().map(s->s.getColor()).collect(Collectors.toSet()); Map<String, String> colorMap = colorList.stream().collect(Collectors.toMap(a->a,s->s)); Map<String,Shape> shapesMap = shpaeList.stream().collect(Collectors.toMap(s->s.getColor(), s->s));
Eclipse點(diǎn)不出getColor()方法,還以為用法不對...
Map<String,Set<Shape>> shapeMapSet = shpaeList.stream().collect(Collectors.groupingBy(s->s.getColor(),Collectors.toSet())); Map<String,Map<String, List<Shape>>> shapeMap3 = shpaeList.stream().collect(Collectors.groupingBy(s->s.getColor(),Collectors.groupingBy(s->s.getColor(),Collectors.toList())));
(4)集合本身的操縱
想要改變現(xiàn)有集合而不產(chǎn)生新的集合可以使用
Iterable.forEach(Consumer),Collection.removeAll(Predicate),List.replaceAll(UnaryOperator),List.sort(Comparator)和Map.computeIfAbsent()等 shpaeList.sort(Comparator.comparing(Shape::getColor));
以上所述是小編給大家介紹的java8中l(wèi)amba表達(dá)式的使用,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時(shí)回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
相關(guān)文章
Java配置JDK開發(fā)環(huán)境及環(huán)境變量
這篇文章主要為大家詳細(xì)介紹了Java配置JDK開發(fā)環(huán)境及環(huán)境變量,文中安裝步驟介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-09-09Mybatis中${param}與#{param}的區(qū)別說明
這篇文章主要介紹了Mybatis中${param}與#{param}的區(qū)別說明,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-06-06Java中Mybatis,SpringMVC,Spring的介紹及聯(lián)系
這篇文章主要為大家詳細(xì)介紹了Java中Mybatis,SpringMVC,Spring的介紹及聯(lián)系,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-10-10防止未登錄用戶操作—基于struts2攔截器的簡單實(shí)現(xiàn)
下面小編就為大家?guī)硪黄乐刮吹卿浻脩舨僮鳌趕truts2攔截器的簡單實(shí)現(xiàn)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-10-10springmvc直接不經(jīng)過controller訪問WEB-INF中的頁面問題
這篇文章主要介紹了springmvc直接不經(jīng)過controller訪問WEB-INF中的頁面問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-02-02Java Apollo是如何實(shí)現(xiàn)配置更新的
這篇文章主要介紹了Java Apollo是如何實(shí)現(xiàn)配置更新的,幫助大家更好的理解和學(xué)習(xí)使用Java,感興趣的朋友可以了解下2021-03-03SpringCloud?Ribbon負(fù)載均衡流程分析
在Eureka注冊中心中我們在添加完@LoadBalanced注解,即可實(shí)現(xiàn)負(fù)載均衡功能,現(xiàn)在一起探索一下負(fù)載均衡的原理(Ribbon),感興趣的朋友一起看看吧2024-03-03SpringBoot中使用@ControllerAdvice注解詳解
這篇文章主要介紹了SpringBoot中使用@ControllerAdvice注解詳解,@ControllerAdvice,是Spring3.2提供的新注解,它是一個(gè)Controller增強(qiáng)器,可對controller中被 @RequestMapping注解的方法加一些邏輯處理,需要的朋友可以參考下2023-10-10