成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Lambda表達式詳細總結,理論加案例

開發 項目管理
近幾年JDK更新速度非常快,2022年9月20號發布JDK19,作為Java語言的使用者,尤其是新入行和想要入行的朋友,不要被這么快的更新速度嚇到,更不要被販賣了焦慮,因為多數版本僅為過渡,如JDK19在2023年3月將會被JDK20替代,完全不必慌張,近幾年JDK更新如此頻繁,真正多的變化其實還在于JDK8之中。

JDK版本迭代

近幾年JDK更新速度非常快,2022年9月20號發布JDK19,作為Java語言的使用者,尤其是新入行和想要入行的朋友,不要被這么快的更新速度嚇到,更不要被販賣了焦慮,因為多數版本僅為過渡,如JDK19在2023年3月將會被JDK20替代,完全不必慌張,近幾年JDK更新如此頻繁,真正多的變化其實還在于JDK8之中。本文章為系列文章,后續內容持續推出!

從1996年1月JDK1.0正式發布到現在,目前有三個主流的長期支持【LTS】版本為JDK8、JDK11、JDK17,因為JDK11并沒有特別大的優化更新,46.45%的企業還是使用2014年3月14號發布的JDK8,JDK17使用率僅在0.37%

JDK8重要更新

繼《??JDK8更新——官網原版詳解??》之后,本篇主要介紹一下JDK更新在編碼層面的重要變化,也就是我們一線程序員需要掌握的都有哪些,網絡上有許多教程,但恰恰是教程太多五花八門,不知所云,一個新特性懟六七個小時實屬浪費時間,學無涯生也有涯,很多玩意我們知道就行不需要去掌握,不要去浪費時間,結合實際工作,我總結了如下幾點:

  • Lambda表達式:非常重要,一種新的編程語法,可簡化代碼,多數特性也基于該語法格式實現,Spring5源碼也大量使用Lambda表達式,現階段開發中大量使用
  • 函數式接口:接口中僅包含一個抽象方法的接口,Lambda表達式需要借助函數式接口實現
  • Stream流:新增對數據的流式操作,不存儲數據,僅用于數據計算,可以對集合、數組、文件等進行多重計算操作,開發簡單,速度快
  • 接口增強:接口中可以提供默認方法
  • 方法引用:可以直接引用已有Java類和對象的方法或構造器,結合Lambda表達式使編程更緊湊簡潔,減少冗余代碼
  • 日期和時間類:全新日期時間API,設計合理,線程安全
  • 引入Optional:用來解決空指針異常

小貼士:本篇文章主要講解Lambda表達式

Lambda表達式

Lambda表達式支持將一個方法【行為】當做參數傳遞,這種編程方式稱為【函數式編程】,這種編程方式最大的特點就是代碼緊湊,減少冗余代碼,讓編程邊的更加簡潔,而Java最大的弊端就在于代碼臃腫,在Python,Scala、JavaScript等語言中也都引入函數式編程,而Java通過Lambda表達式實現函數式編程勢在必行!

語法格式

Lembda表達式通過左側的參數,右側的表達式和中間的右箭頭組成:

  • 參數可以為空
  • 可以沒有返回值

// 有參有返回值
(parameter1,parameter12,...) -> {
expression;
...
return xxx;
}
// 無參有返回值
() -> {
expression;
...
return xxx;
}

// 有參無返回值
(parameter1,parameter12,...) -> {
expression;
...
}

// 無參無返回值
() -> {
expression;
...
}

實現原理

  • Lambda表達式也并不是想用就用,必須依賴于函數式接口才可使用
  • 函數式接口:即接口中只有一個抽象法的接口,在JDK8及以后版本都會使用 @FunctionalInterface注解修飾
  • 類型推斷:Lambda表達式無需指定參數類型,程序依然可以編譯,Lambda表達式的類型依據上下文環境,由編譯器推斷出來參數類型,這就是類型推斷

重點掌握

  • Lambda表達式實現前提
  • 理解函數式接口
  • Lambda表達式實現語法和案例
  • Lambda表達式簡寫
  • Lambda對集合、線程等的操作練習

無參實現

Lambda表達式實現需要依賴于函數式接口,JDK內置了一些函數式接口,使用Supplier來實現無參Lambda講解,至于函數式接口怎么自定義在后續單獨介紹,保證連貫性,在此不穿插函數式接口其他內容!

Supplier接口為JDK內置的供給型接口,特點為無參數但是有返回值,定義如下:

代碼:

package com.stt;

import java.util.function.Supplier;

/**
* 無參函數式接口
*/
public class NoArgsMain {
public static void main(String[] args) {
// 1、原始方式實現
Supplier<Integer> s1 = new Supplier<Integer>() {
@Override
public Integer get() {
return 1024;
}
};
// 通過get方法獲取返回值
System.out.println(s1.get());

// 2、通過Lambda表達是實現
Supplier<String> s2 = () -> {
return "Lambda實現";
};
// 通過get方法獲取返回值
System.out.println(s2.get());
}
}

簡化代碼:

如果Lambda表達式有返回值且代碼體只有一行代碼時,return和大括號可以省略不寫

// 1、簡化后代碼如下
public class NoArgsMain {
public static void main(String[] args) {

/*
1、函數體只有一行代碼,return可以省略
2、只有一行代碼大括號可以省略
*/
Supplier<String> s2 = () -> "Lambda實現";
// 通過get方法獲取返回值
System.out.println(s2.get());
}
}

// 2、如果有多行,則不可以省略
public class NoArgsMain {
public static void main(String[] args) {
// 通過Lambda表達是實現,因為函數體有其他代碼,不可省略return和大括號
Supplier<String> s2 = () -> {
System.out.println("我是Lambda表達式體");
return "Lambda實現";
};
// 通過get方法獲取返回值
System.out.println(s2.get());
}
}

有參實現

通過JDK內置Consumer接口實現,接收參數但沒有返回值,定義如下:

代碼實現:

package com.stt;

import java.util.function.Consumer;

public class HasArgsMain {
public static void main(String[] args){
// 1、原始實現
Consumer<Integer> consumer1 = new Consumer<Integer>() {
@Override
public void accept(Integer param){
// 沒有返回值
System.out.println("我是消費型接口,只進不出哦!" + param);
}
};
// 調用accpet方法消費數據
consumer1.accept(1024);

// 2、Lambda寫法,
Consumer<String> consumer2 = (str) -> {
System.out.println("我是Lambda消費型接口," + str);
};
consumer2.accept("石添添");
}
}

簡化寫法:

public class HasArgsMain {
public static void main(String[] args) {
/*
1、如果只有一個參數則可以省略小括號
2、代碼體只有一行代碼則可以省略大括號
*/
Consumer<String> consumer2 = str -> System.out.println("我是Lambda消費型接口," + str);
consumer2.accept("石添添");
}
}

總結:

如果代碼體只有一行代碼,無論有無參數,大括號都可省略

如果有返回值,代碼體只有一行代碼則return可以省略

如果有且僅有一個參數,參數的小括號可以省略,沒有參數和有多個參數都不可省略、

有沒有那么一點點感覺,Lambda表達式簡化了代碼,讓編碼更加簡潔,接下來我們通過更多案例對比進一步理解和使用Lambda表達式

Lambda實現線程創建

通過Runnable接口創建線程,如果想使用Lambda那么Runnable應該是一個函數式接口,函數式接口的特點是只有一個抽象方法,Runnable接口定義如下:

代碼實現:

public class ThreadMain {
public static void main(String[] args) {
// 1、原始方式創建線程
new Thread(new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + "線程啟動");
}
}).start();

// 2、使用Lambda表達式簡寫方式創建線程
new Thread(() -> System.out.println(Thread.currentThread().getName() + "線程啟動")).start();
}
}

Lambda實現集合遍歷

集合操作新增forEach方法,接收一個Consumer類型對象,上邊【有參實現】中介紹了,它是一個函數式接口

代碼實現:

public class CollectionMain {
public static void main(String[] args){
// 創建集合
List<String> list = new ArrayList<>();
// 添加數據
list.add("艾斯!");
list.add("賽羅!");
list.add("杰克!");
list.add("雷歐!");
// 1、原始遍歷方式
list.forEach(new Consumer<String>() {
@Override
public void accept(String s) {
System.out.println(s);
}
});
// 2、因為Consumer是一個函數式接口,可以使用Lambad
// 思考:簡寫形式怎么實現呢?
list.forEach((str) -> {
System.out.println(str);
});
}
}

Lambda實現集合排序

集合排序可以使用sort方法,sort方法接收一個Comparator類型數據

Comparator接口定義

小貼士:該接口中還有幾個默認實現方法和靜態方法,因為只有一個抽象方法所以也是函數式接口

代碼實現:

public class CollectionSortMain {
public static void main(String[] args) {
List<Person> personList = new ArrayList<>();
personList.add(new Person("李小白",24));
personList.add(new Person("張二三",21));
personList.add(new Person("王五六",30));
// 遍歷
System.out.println("排序前-------------------");
personList.forEach(person -> System.out.println(person));
// 排序,參數1 - 參數2為升序排序
System.out.println("排序后-------------------");
personList.sort(new Comparator<Person>() {
@Override
public int compare(Person p1, Person p2) {
return p1.getAge() - p2.getAge();
}
});
personList.forEach(person -> System.out.println(person));
// Lambda排序,參數2 - 參數1為降序排序
System.out.println("Lambda排序-------------------");
// 直接簡寫形式,只有一行代碼,大括號和return可以省略
personList.sort((p1,p2) -> p2.getAge() - p1.getAge());
personList.forEach(person -> System.out.println(person));
}
}

總結

Lambda表達式簡化開發,使編碼變的簡潔。

Lambda表達式需要依賴函數式接口實現,一定情況下可以簡化寫法。

StreamAPI、方法引用等特性需要基于Lambda實現。

Lambda表達式剛開始可能不習慣,多些就好,一定要多用哦!

文章出自:??添甄??,如有轉載本文請聯系【添甄】今日頭條號。

責任編輯:武曉燕 來源: 今日頭條
相關推薦

2009-09-17 10:40:22

Linq Lambda

2009-09-09 17:14:17

Linq lambda

2009-09-09 13:01:33

LINQ Lambda

2009-09-15 15:18:00

Linq Lambda

2022-12-05 09:31:51

接口lambda表達式

2009-09-11 09:48:27

Linq Lambda

2009-08-27 09:44:59

C# Lambda表達

2009-09-15 17:30:00

Linq Lambda

2009-09-17 09:44:54

Linq Lambda

2012-06-26 10:03:58

JavaJava 8lambda

2009-07-03 18:31:04

JSP表達式

2024-03-25 13:46:12

C#Lambda編程

2013-04-07 15:44:26

Java8Lambda

2009-08-10 09:41:07

.NET Lambda

2013-04-10 10:58:19

LambdaC#

2009-08-27 09:57:50

C# Lambda表達

2009-08-31 17:11:37

Lambda表達式

2009-09-17 09:09:50

Lambda表達式Linq查詢

2009-08-26 16:17:23

C# Lambda表達

2021-08-07 07:21:26

AndroidKotlinLambda
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 午夜免费福利片 | 最新国产精品精品视频 | 欧美激情精品久久久久久 | 国产精品国产精品国产专区不卡 | 成人在线视频一区 | 亚洲a一区| 一区二区三区免费在线观看 | 一区二区三区不卡视频 | 欧美精品电影一区 | 久久久做| 中文字幕91av | 毛片在线视频 | 亚洲视频免费观看 | www.av在线 | 久久国产精品免费一区二区三区 | 超碰成人免费 | 久久久久久久久毛片 | 九九精品在线 | 91精品国产自产精品男人的天堂 | av在线天堂 | 国产精品久久国产愉拍 | 亚洲日本欧美日韩高观看 | 在线观看黄色电影 | 亚洲一区二区三区免费观看 | 亚洲精品字幕 | 日本久久精品视频 | 国产激情自拍视频 | 久久综合激情 | 老头搡老女人毛片视频在线看 | 午夜99| 午夜激情国产 | 羞羞视频在线观看免费观看 | 精品久久九| 看一级黄色毛片 | 黄色网络在线观看 | 亚州精品天堂中文字幕 | 午夜久久av| 亚洲国产成人av好男人在线观看 | 亚洲国产69 | 综合色播 | 求个av网址 |