Java8的Lambda表示式初步學習
Lambda表示式是java8新出的特性,lambda是一塊程式碼,由於java中沒有函式型別,我們不得不將實現特定功能的程式碼塊寫在匿名內部類中,早就有人調侃匿名內部類型別一行、方法名一行,真正方法內容一行,而有了lambad表示式,我們可以取代部分匿名內部類,減少多餘程式碼,提高程式碼可讀性。
常用場合:
1.實現Comparator介面,進行排序操作
2.實現Runnable介面,進行多執行緒操作
3.實現事件監聽器ActionListener介面,進行事件監聽
4.對集合資料進行操作,Java8為了支援Lambad對集合新增了很多方法,可以用更簡潔的方法做同樣的事情。
Ps:Lambda的用法很多,其餘的靜待你慢慢挖掘
例子1:實現Comparator介面排序。
用Lambda之前,我們先看看原來我們是怎麼實現的:
這段程式碼首先輸出bdcae,經過實現Comparator介面的排序後輸出abcde,下面是Lambda實現:List<String>list=Arrays.asList("b","d","c","a","e"); System.out.println(list); list.sort(newComparator<String>() { @Override public int compare(String x, String y) { return x.compareTo(y); } }); System.out.println(list);
List<String>list=Arrays.asList("b","d","c","a","e");
System.out.println(list);
list.sort((x,y)->x.compareTo(y));
System.out.println(list);
研究這兩段程式碼,我們知道,其實排序的核心只有
例子2:實現Runnable介面的多執行緒。
依舊,先看看我們原來怎麼做的:
new Thread(new Runnable() {
public void run() {
System.out.println("abc");
}
}).start();
這段程式碼很簡單,新開一個執行緒輸出abc,我們知道,核心就在輸出abc,仿照例1,你是不是有點明白Lambad怎麼用了?下面是Lambda實現:new Thread(()->System.out.println("abc")).start();
上面的Lambda表示式裡沒有引數傳遞,所以()裡是空的,而例1裡傳入了x,y,但是沒有寫出型別,這是因為如果Lambda表示式的引數型別可以被推匯出來時可以省略不寫,寫上型別也是沒有錯的,不過要寫上型別的話所有引數都必須寫上。
例3:事件監聽器。
自建一個Jframe窗體和一個按鈕,事件程式碼如下:
button.addActionListener(newActionListener() {
@Override
public voidactionPerformed(ActionEvent e) {
JOptionPane.showMessageDialog(null, "hello");
}
});
彈出一個對話方塊寫著hello,想必現在你已經會使用Lambda改寫了吧,先自己試一下,然後對比下面的程式碼:button.addActionListener((e)->JOptionPane.showMessageDialog(null,
"hello"));
現在是不是有個疑惑,Lambda是不是隻能寫簡短的語句呢?答案當然是否定的,用大括號包起程式碼塊即可如下:button.addActionListener((e)->{
Stringx="hello";
JOptionPane.showMessageDialog(null, x);
});
我就不費事寫一大串程式碼了,Lambda表示式的方法體與巢狀程式碼塊有著相同的作用域,也適用同樣的命名衝突和遮蔽規則。
例4:集合操作
還記得例1輸出的陣列集合嗎?如果我們不是要一次性打印出整個陣列,而是遍歷,我們一般是這樣寫的:
for (String string : list) {
System.out.println(string);
}
Java8新增了很多支援Lambda表示式的對集合的操作方法,其中有一個就是遍歷,你可以這樣寫:list.forEach(x->System.out.println(x));
不過我推薦下面這種更優雅的寫法:list.forEach(System.out::println);
為了下文涉及到的::(兩個冒號)操作符,我們再看一個例子。Objects類定義了isNull方法,它返回一個bool值。ArrayList新增了一個removeIf方法,引數是Predicate型別。是專門用來傳遞Lambda表示式的。下面的程式碼是刪除陣列列表裡的null值:List<String> list=new ArrayList<String>(Arrays.asList("b","d","c",null,"e"));
list.forEach(System.out::print);
list.removeIf(x->Objects.isNull(x));
list.forEach(System.out::print);
第一次輸出是有null值的,第二次則去掉了,下面我們用::的形式,這種更優雅:list.removeIf(Objects::isNull);
和上面是一樣的效果。
正如你看到的那樣,操作符 :: 將方法名稱與類或物件名稱分隔開。
有以下三種使用方式:
1.類 :: 例項方法
2.類 :: 靜態方法
3.物件 :: 例項方法
第一種使用方式,第一個引數變成方法的接收者,並且其他引數也傳遞給該方法。例如例1的排序(x,y)->x.compareTo(y),可以寫成String::compareTo。
第二種方式,所有的引數傳遞給靜態方法。例如上面的x->Objects.isNull(x)等同於Objects::isNull。
第三種方式,在給定的物件上呼叫方法,並且引數傳遞給例項方法。例如x->System.out.println(x)等同於System.out::println。
此外還有很多新增的方法沒有舉例。但Lambda的基本用法想必已經很清晰了,使用Lambda可以使我們寫出更簡潔優雅的程式碼,希望大家一起學習。
相關推薦
Java8的Lambda表示式初步學習
Lambda表示式是java8新出的特性,lambda是一塊程式碼,由於java中沒有函式型別,我們不得不將實現特定功能的程式碼塊寫在匿名內部類中,早就有人調侃匿名內部類型別一行、方法名一行,真正方法內容一行,而有了lambad表示式,我們可以取代部分匿名內部類,減少多餘程式
快速冪初步學習
去掉 進制 二進制 末尾 刪掉 nbsp light log mil 快速冪顧名思義就是快速求冪,也常用於求冪的模(余數) 例如求Xq,常規算法是乘q次X,時間復雜度為O(n),而快速冪復雜度為O(log2n),我們看下如何實現 n用二進制可寫成2k1+2K2+..
01.Vue初步學習
aps rip pen 周期 pro http alt span -i 1.什麽是Vue? Vue:一個可以幫助你實現前端MVVM的簡單框架,易於上手。 2.入門使用 聲明式渲染方式,使用{{}}標記占位符 <div id="app">
Python的初步學習-引號
引號 spa 想要 href invalid 基本 -- 輸出 clas (參考教材:簡明Python教程) 地址:http://www.kuqin.com/abyteofpython_cn/ ----------------------------------------
Python的初步學習-自然字符串
轉義符 python code 這樣的 blog 學習 div span int 1 print (r‘ what\‘s your name? ‘) 2 what\‘s your name? 自然字符串就是可以顯示出像轉義符這樣的特殊字符,具體目的不知道。 正則表達
UWP的初步學習
log -1 nbsp ges image .cn 學習 9.png es2017 UWP的初步學習
activeMq初步學習
接收 什麽是 ive 成功 發布訂閱 主題 cti 中間 activemq 今天開始學習activeMq 。 什麽是MQ , MQ是消息中間件 。 消息模型: 點對點模型和 發布訂閱模型 。 點對點模型:生產者生產消息,放到MQ中,消費者消費消息。 每個消息如果不過期,則會
重學Python - Day 03 - python基礎 -> while循環實例 + Continue && break的應用 + 列表的初步學習
style 註釋 內置函數 就是 span import password pytho gin while語句的應用 實例如下: 1 """ 2 述求:用戶登錄系統,最多只能登錄三次 3 第三次失敗後,程序終止 4 5 ""
線程與進程的初步學習
ack leg 多核 服務器 cnblogs 進程 star bsp 通過 什麽情況下使用多線程: 多線程一般被用來在後天執行耗時的任務。主線程保持運行,並且工作線程做他的後臺工作 另一個多線程的用途是在方法中完成一個復雜的計算工作。這個方法會在多核的電腦上運行的
JavaWeb的初步學習一
分享圖片 script query link 用戶 gin sheet where etc 在html頁面輸入內容與數據庫驗證是否匹配,即登錄驗證 數據庫設計 login.html <!DOCTYPE html> <html> <h
初步學習React Router 4.0
logs root erro gist 技術分享 發布 run row div React Router 4.0 (以下簡稱 RR4) 已經正式發布,它遵循React的設計理念,即萬物皆組件。 初始化項目啟動之後: 查看相關的配置:npm run eject 查看下p
初步學習多線程2
優點 加油 缺點 pos 學習 機會 super 加油!!!! 加油! 線程代碼展示: 兔子線程實現Runnable接口: package thread; /** * 兔子的線程 * @author superdrew */ public class Rabbit
初步學習HashTable(哈希表或者散列鏈表)
htable targe 利用 hash win del 單個字符 pan 字符 初次接觸哈希表,我談談自己對哈希表的一些理解,可能有誤,還望指正。 對於哈希表,存放的數據是鍵值對<key,value>。是按照鍵值來索引的,鍵key可以是字符串、單個字符、整形數
linux初步學習
arc 首字母 cti 方便 是什麽 adl 用戶命令 shells size 1:linux終端可以分為以下幾類:(1)設備終端:鍵盤,鼠標,顯示器。(2)物理終端(/dev/console):控制臺console(3)虛擬終端:共有6個,其中有一個是圖形化終端(Ctrl
mysql初步學習
正則表達式 sport 新的 left 函數 nts 一個表 gpo rollup 1.insert_select 的使用:從一個表復制數據給另一個表 INSERT INTO students(name,sex,LikeBooksNUM,LikesportNUM,avera
強化學習初步學習
image eva gin ive span auto isp block pla Iterative Policy Evaluation How to Improve a Policy
對CountDownLatch的初步學習
nano jdk ive spec opera testing PE als AR CountDownLatch的中文翻譯為"閉鎖",在JDK1.5中 CountDownLatch類加入進來。為程序猿進行並發編程提供有利的幫助。 首先我們先看看JDK文檔中對於Cou
初步學習JAVA面向對象初步認識及面向對象內存分析圖舉例說明
多態 ... txt 事務 class void 內存模型 規模 println 1. 說到面向對象, 一個繞不開的話題,就是面向過程. 面向過程適合簡單、不需要協作的事務。 面向過程 = 分解問題 + 邏輯為先 = 先細節,再整體。 對比面向過程, 面向對象
CentOS初步學習記錄(三)Wget文件下載和Sed文件處理
下載速度 file 文件 socket cut inux 調試 數據行 use mozilla 一、wget 命令 wget命令用來從指定的URL下載文件,wget非常穩定,它在帶寬很窄的情況下和不穩定網絡中有很強的適應性,如果是由於網絡的原因下載失敗,wget會不斷
.net core 2.0 mvc 初步學習
OS table 處理機 d+ rect source service tor run mvc_study html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,a