一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - Java8深入學習系列(一)lambda表達式介紹

Java8深入學習系列(一)lambda表達式介紹

2020-12-13 18:35王爵nice Java教程

Java8最值得學習的特性就是Lambda表達式和Stream API,所以我們學習java8的第一課就是學習lambda表達式,下面這篇文章主要給大家介紹了關于Java8學習之lambda的相關資料,文中介紹的非常詳細,需要的朋友可以參考借鑒,下面來一起看看

前言

最近在學習java8,所以接下來會給大家介紹一系列的Java8學習內容,那么讓我們先從lambda表達式開始。

眾所周知從java8出現以來lambda是最重要的特性之一,它可以讓我們用簡潔流暢的代碼完成一個功能。 很長一段時間java被吐槽是冗余和缺乏函數式編程能力的語言,隨著函數式編程的流行java8種也引入了 這種編程風格。在此之前我們都在寫匿名內部類干這些事,但有時候這不是好的做法,本文中將介紹和使用lambda, 帶你體驗函數式編程的魔力。

Java8深入學習系列(一)lambda表達式介紹

什么是lambda?

lambda表達式是一段可以傳遞的代碼,它的核心思想是將面向對象中的傳遞數據變成傳遞行為。 我們回顧一下在使用java8之前要做的事,之前我們編寫一個線程時是這樣的:

?
1
2
3
4
5
6
Runnable r = new Runnable() {
 @Override
 public void run() {
 System.out.println("do something.");
 }
}

也有人會寫一個類去實現Runnable接口,這樣做沒有問題,我們注意這個接口中只有一個run方法, 當把Runnable對象給Thread對象作為構造參數時創建一個線程,運行后將輸出do something. 。 我們使用匿名內部類的方式實現了該方法。

這實際上是一個代碼即數據的例子,在run方法中是線程要執行的一個任務,但上面的代碼中任務內容已經被規定死了。 當我們有多個不同的任務時,需要重復編寫如上代碼。

設計匿名內部類的目的,就是為了方便 Java 程序員將代碼作為數據傳遞。不過,匿名內部 類還是不夠簡便。 為了執行一個簡單的任務邏輯,不得不加上 6 行冗繁的樣板代碼。那如果是lambda該怎么做?

?
1
Runnable r = () -> System.out.println("do something.");

嗯,這代碼看起來很酷,你可以看到我們用()和->的方式完成了這件事,這是一個沒有名字的函數,也沒有人和參數,再簡單不過了。 使用->將參數和實現邏輯分離,當運行這個線程的時候執行的是->之后的代碼片段,且編譯器幫助我們做了類型推導; 這個代碼片段可以是用{}包含的一段邏輯。下面一起來學習一下lambda的語法。

基礎語法

在lambda中我們遵循如下的表達式來編寫:

?
1
expression = (variable) -> action
  • variable: 這是一個變量,一個占位符。像x,y,z,可以是多個變量。
  • action: 這里我稱它為action, 這是我們實現的代碼邏輯部分,它可以是一行代碼也可以是一個代碼片段

可以看到Java中lambda表達式的格式:參數、箭頭、以及動作實現,當一個動作實現無法用一行代碼完成,可以編寫 一段代碼用{}包裹起來。

lambda表達式可以包含多個參數,例如:

?
1
int sum = (x, y) -> x + y;

這時候我們應該思考這段代碼不是之前的x和y數字相加,而是創建了一個函數,用來計算兩個操作數的和。 后面用int類型進行接收,在lambda中為我們省略去了return。

函數式接口

函數式接口是只有一個方法的接口,用作lambda表達式的類型。前面寫的例子就是一個函數式接口,來看看jdk中的Runnable源碼

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@FunctionalInterface
public interface Runnable {
 /**
 * When an object implementing interface <code>Runnable</code> is used
 * to create a thread, starting the thread causes the object's
 * <code>run</code> method to be called in that separately executing
 * thread.
 * <p>
 * The general contract of the method <code>run</code> is that it may
 * take any action whatsoever.
 *
 * @see java.lang.Thread#run()
 */
 public abstract void run();
}

這里只有一個抽象方法run,實際上你不寫public abstract也是可以的,在接口中定義的方法都是public abstract的。 同時也使用注解@FunctionalInterface告訴編譯器這是一個函數式接口,當然你不這么寫也可以,標識后明確了這個函數中 只有一個抽象方法,當你嘗試在接口中編寫多個方法的時候編譯器將不允許這么干。

嘗試函數式接口

我們來編寫一個函數式接口,輸入一個年齡,判斷這個人是否是成人。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public class FunctionInterfaceDemo {
 @FunctionalInterface
 interface Predicate<T> {
 boolean test(T t);
 }
 /**
 * 執行Predicate判斷
 *
 * @param age 年齡
 * @param predicate Predicate函數式接口
 * @return  返回布爾類型結果
 */
 public static boolean doPredicate(int age, Predicate<Integer> predicate) {
 return predicate.test(age);
 }
 
 public static void main(String[] args) {
 boolean isAdult = doPredicate(20, x -> x >= 18);
 System.out.println(isAdult);
 }
}

從這個例子我們很輕松的完成 是否是成人 的動作,其次判斷是否是成人,在此之前我們的做法一般是編寫一個 判斷是否是成人的方法,是無法將 判斷 共用的。而在本例只,你要做的是將 行為 (判斷是否是成人,或者是判斷是否大于30歲) 傳遞進去,函數式接口告訴你結果是什么。

實際上諸如上述例子中的接口,偉大的jdk設計者為我們準備了java.util.function包

Java8深入學習系列(一)lambda表達式介紹

我們前面寫的Predicate函數式接口也是JDK種的一個實現,他們大致分為以下幾類:

 

接口 參數 返回值 類別 示例
Consumer T void 消費型接口 輸出一個值
Supplier None T 供給型接口 工廠方法
Function T R 函數型接口 獲得 Artist 對象的名字
Predicate T boolean 斷言型接口 這張唱片已經發行了嗎

 

消費型接口示例

?
1
2
3
4
5
6
public static void donation(Integer money, Consumer<Integer> consumer){
 consumer.accept(money);
}
public static void main(String[] args) {
 donation(1000, money -> System.out.println("好心的麥樂迪為Blade捐贈了"+money+"元")) ;
}

供給型接口示例

?
1
2
3
4
5
6
7
8
9
10
public static List<Integer> supply(Integer num, Supplier<Integer> supplier){
 List<Integer> resultList = new ArrayList<Integer>() ;
 for(int x=0;x<num;x++)
  resultList.add(supplier.get());
 return resultList ;
}
public static void main(String[] args) {
 List<Integer> list = supply(10,() -> (int)(Math.random()*100));
 list.forEach(System.out::println);
}

函數型接口示例

轉換字符串為Integer

?
1
2
3
4
5
6
public static Integer convert(String str, Function<String, Integer> function) {
 return function.apply(str);
}
public static void main(String[] args) {
 Integer value = convert("28", x -> Integer.parseInt(x));
}

斷言型接口示例

篩選出只有2個字的水果

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public static List<String> filter(List<String> fruit, Predicate<String> predicate){
 List<String> f = new ArrayList<>();
 for (String s : fruit) {
 if(predicate.test(s)){
  f.add(s);
 }
 }
 return f;
}
public static void main(String[] args) {
 List<String> fruit = Arrays.asList("香蕉", "哈密瓜", "榴蓮", "火龍果", "水蜜桃");
 List<String> newFruit = filter(fruit, (f) -> f.length() == 2);
 System.out.println(newFruit);
}

默認方法

在Java語言中,一個接口中定義的方法必須由實現類提供實現。但是當接口中加入新的API時, 實現類按照約定也要修改實現,而Java8的API對現有接口也添加了很多方法,比如List接口中添加了sort方法。 如果按照之前的做法,那么所有的實現類都要實現sort方法,JDK的編寫者們一定非常抓狂。

幸運的是我們使用了Java8,這一問題將得到很好的解決,在Java8種引入新的機制,支持在接口中聲明方法同時提供實現。 這令人激動不已,你有兩種方式完成 1.在接口內聲明靜態方法 2.指定一個默認方法。

我們來看看在JDK8中上述List接口添加方法的問題是如何解決的

?
1
2
3
4
5
6
7
8
9
default void sort(Comparator<? super E> c) {
 Object[] a = this.toArray();
 Arrays.sort(a, (Comparator) c);
 ListIterator<E> i = this.listIterator();
 for (Object e : a) {
 i.next();
 i.set((E) e);
 }
}

翻閱List接口的源碼,其中加入一個默認方法default void sort(Comparator<? super E> c) 。 在返回值之前加入default關鍵字,有了這個方法我們可以直接調用sort方法進行排序。

?
1
2
3
List<Integer> list = Arrays.asList(2, 7, 3, 1, 8, 6, 4);
list.sort(Comparator.naturalOrder());
System.out.println(list);

Comparator.naturalOrder()是一個自然排序的實現,這里可以自定義排序方案。 你經常看到使用Java8操作集合的時候可以直接foreach的原因也是在Iterable接口中也新增了一個默認方法:forEach , 該方法功能和 for 循環類似,但是允許 用戶使用一個Lambda表達式作為循環體。

在后面的章節中我們再次通過案例來展示函數式編程的魅力 :)

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對服務器之家的支持。

原文鏈接:http://biezhi.me/2017/07/17/keep-up-with-java8-lambda.html

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 免费毛片在线观看 | 国产一区二区三区免费在线视频 | 欧美春宫| www.午夜剧场 | 国产精品第一 | 日日干影院 | narutotsunade全彩雏田 | free性泰国女人hd | 射西西| 私人黄色 | 欧美在线一级视频 | 无码人妻少妇色欲AV一区二区 | 免费看全黄特黄毛片 | 亚洲视频国产精品 | 午夜欧美精品久久久久久久 | 精品夜夜澡人妻无码AV蜜桃 | 亚洲国产欧美在线看片 | 手机免费在线视频 | 日本公乱妇视频 | pron欧美| 398av影院视频在线 | 隔壁老王国产精品福利 | 日韩三及片| 成人精品第一区二区三区 | 青青青国产精品国产精品美女 | 免费午夜网站 | 日本中文字幕高清 | 国产rpg迷雾之风冷狐破解 | 国产 国语对白 露脸正在播放 | 亚洲 欧美 国产 在线 日韩 | 免费看日本 | 人人爽人人香蕉 | 99视频精品国在线视频艾草 | 日韩成人一区ftp在线播放 | 黄蓉h系列| 羞羞漫画免费漫画页面在线看漫画秋蝉 | 青草免费在线 | 男人影院在线观看 | 黑人video粗暴日本 | 校园刺激全黄H全肉细节文 校草让我脱了内裤给全班看 | 91短视频社区在线观看 |