Java 8新特性
阿新 • • 發佈:2020-11-20
(一)Lambda表示式(匿名函式)
(二)Stream多執行緒並行資料處理
新特性:
1、介面的預設方法只需要使用default關鍵字即可,這個特徵又叫擴充套件方法
2、Lambda表示式
3、Functional介面函式式介面是指僅僅只包含一個抽象方法的介面,每個該型別的Lambda表示式都會匹配到這個抽象方法。只需要給介面新增 @FunctioalInterface
4、使用 ::雙冒號關鍵字來傳遞方法(靜態方法和非靜態方法)
5、predicate介面和Lambda表示式
6、Function介面
6.1 Function有一個引數並且返回一個結果,並附帶了一些可以和其他函式組合的預設方法
6.2compose 方法表示在某個方法之前執行
6.3 andThen 方法表示在某個方法之後執行
*compose 和 andThen 方法呼叫之後都會把物件自己本身返回,這可以方便鏈式程式設計
7、Supplier 介面,返回一個任意範型的值,和 Function 介面不同的是該介面沒有任何引數
8、Consumer 介面,接收一個任意範型的值,和 Function 介面不同的是該介面沒有任何值
9、Optional 類
- Optional 不是介面而是一個類,這是個用來防止
NullPointerException
異常的輔助型別 - Optional 被定義為一個簡單的容器,其值可能是 null 或者不是 null。
- 在 Java8 之前一般某個函式應該返回非空物件但是偶爾卻可能返回了 null,而在 Java8 中,不推薦你返回 null 而是返回 Optional。
- 這是一個可以為 null 的容器物件。
- 如果值存在則
isPresent()
方法會返回 true,呼叫get()
方法會返回該物件。
小試牛刀
package com.zjq.jdk8.feature.lambda;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
/**
* Lambda 基本用法
* @author zjq
* @version 1.0.0
* @date 2020/11/20 10:42
*/
public class BaseLambda {
public static void main(String[] args) {
testForeach();
testStreamDuplicates();
}
/**
* Lambda 遍歷
*/
public static void testForeach() {
// 定義一個數組
String[] array = {
"尼爾機械紀元",
"關於我轉生成為史萊姆這件事",
"實力至上主義教師",
"地獄少女"
};
// 轉換成集合
List<String> acgs = Arrays.asList(array);
// 傳統的遍歷方式
System.out.println("傳統的遍歷方式:");
for (String acg : acgs) {
System.out.println(acg);
}
System.out.println();
// 使用 Lambda 表示式以及函式操作(functional operation)
System.out.println("Lambda 表示式以及函式操作:");
acgs.forEach((acg) -> System.out.println(acg));
System.out.println();
// 在 Java 8 中使用雙冒號操作符(double colon operator)
System.out.println("使用雙冒號操作符:");
acgs.forEach(System.out::println);
System.out.println();
}
/**
* Stream 去重複
* String 和 Integer 可以使用該方法去重
*/
public static void testStreamDuplicates() {
System.out.println("Stream 去重複:");
// 定義一個數組
String[] array = {
"尼爾機械紀元",
"尼爾機械紀元",
"關於我轉生成為史萊姆這件事",
"關於我轉生成為史萊姆這件事",
"實力至上主義教師",
"實力至上主義教師",
"地獄少女",
"地獄少女"
};
// 轉換成集合
List<String> acgs = Arrays.asList(array);
// Stream 去重複
acgs = acgs.stream().distinct().collect(Collectors.toList());
// 列印
acgs