1. 程式人生 > >Java8的Lambda表示式初步學習

Java8的Lambda表示式初步學習

Lambda表示式是java8新出的特性,lambda是一塊程式碼,由於java中沒有函式型別,我們不得不將實現特定功能的程式碼塊寫在匿名內部類中,早就有人調侃匿名內部類型別一行、方法名一行,真正方法內容一行,而有了lambad表示式,我們可以取代部分匿名內部類,減少多餘程式碼,提高程式碼可讀性。

常用場合:

1.實現Comparator介面,進行排序操作

2.實現Runnable介面,進行多執行緒操作

3.實現事件監聽器ActionListener介面,進行事件監聽

4.對集合資料進行操作,Java8為了支援Lambad對集合新增了很多方法,可以用更簡潔的方法做同樣的事情。

Ps:Lambda的用法很多,其餘的靜待你慢慢挖掘

例子1:實現Comparator介面排序。

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);
這段程式碼首先輸出bdcae,經過實現Comparator介面的排序後輸出abcde,下面是Lambda實現:
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);

研究這兩段程式碼,我們知道,其實排序的核心只有

x.compareTo(y)這一句,Lambda表示式讓人更一目瞭然。

例子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裡傳入了xy,但是沒有寫出型別,這是因為如果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