昨天內容回顧:
1、Lambda表達式 jdk1.8之後的新特性
Lambda表達式的前提:
1 Lambda表達式必須是接口類型。
2、接口中有且僅有一個抽象方法。
Lambda表達式的語法:
(方法的參數列表)->{方法體}
Lambda表達式的簡化格式:
1、任意情況下,參數列表中的參數類型都可以省略。
2、如果參數列表只有一個參數,那麼()可以省略。
3、如果方法體中有且僅有一條語句,那麼{}和;一起省略,如果有return,那麼return也要一起省略。
Lambda表達式的好處:
簡化匿名內部類的書寫,但是不能完全替代匿名內部類。
lambda表達式和匿名內部類的區別:
1、能使用Lambda表達式的地方就一定可以使用匿名內部類,但是能使用匿名內部類的地方不一定能使用Lambda表達式。
2、匿名內部類編譯之後有class文件,lambda表達式編譯之後不會產生class文件。
2、接口新特性
默認方法:
靜態方法:
私有方法:
3、方法引用:
方法引用的好處:
方法引用可以替換部分的Lambda表達式的書寫。
使用場景:
如果Lambda表達式的的方法體中有且僅有一條語句,且符合 對象.方法() 、類名 .方法() 、new 類名() ,那麼就可以使用方法引用
代替Lambda表達式
語法:
對象.方法()------>對象::方法名 例如:System.out::println 注意:不需要寫()
類名 .方法()----->類名::方法名 例如:Integer::parseInt
new 類名()------>類名::new 例如:Student::new
今日內容:
1、函數式接口
1、概念:有且僅有一個抽象方法的接口就叫做函數式接口。可以使用@FunctionalInterface註解檢查。
注意:一個接口是不是函數式接口和@FunctionalInterface沒有任何關係,只和抽象方法的個數有關。如果這個接口不是函數式接口,
那麼加上這個註解之後就會編譯報錯。
例如:JDK中的Runnable接口就是一個函數式接口
@FunctionalInterface
public interface Runnable {
public abstract void run();
}
2、使用場景:作爲方法的參數或者返回值
3、JDK中常見的函數式接口
Supplier<T>:生產型接口
T get():get()方法不需要給參數,反而給你返回一個T類型的值。
Consumer<T>:消費型接口
void accept(T t):需要一個T類型的參數,沒有返回值,通過accept將T類型的數據交給我們使用(消費) (掌握)
default Consumer<T> andThen(Consumer<? super T> after):將兩個Consumer連接,分別消費數據
例如:
//遍歷輸出 (T t)
list.forEach(num->System.out.println(num));
System.out.println("--------------");
//方法引用
list.forEach(System.out::println);
Predicate<T>:判斷型接口
boolean test(T t):將給定的T類型的參數在test方法中進行條件判斷,返回判斷結果。
Function<T,R>:轉換型接口
R apply(T t):將T類型的參數傳遞給方法,轉換成R類型之後返回。
2、Stream流
概念:Stream流就是一套操作集合的工具集。工具集:指的就是Stream流中已經封裝好了很多操作集合的方法,我們當作工具直接用就行了。
Stream流操作的對象:單列集合、數組、Map集合(只能間接操作)。
使用注意事項:Stream流對象只能被使用一次,否則會出現如下異常:
java.lang.IllegalStateException: stream has already been operated upon or closed
Stream流操作的步驟:
1、生成Stream流對象
Stream<T> stream=單列集合對象.stream();
Stream<T> stream=Stream.of(T... t);
注意:Map集合必須要先轉換成單列集合(keySet()或者entrySet())之後纔可以生成Stream流對象。
2、調用Stream流對象的方法
Stream<T> filter(Predicate predicate):用於對流中的數據進行過濾,需要使用Predicate接口傳遞過濾條件
Stream<T> limit(long maxSize):截取前指定參數個數的數據,返回截取的元素組成的新流
Stream<T> skip(long n):跳過指定參數個數的數據,返回由該流的剩餘元素組成的新流
static <T> Stream<T> concat(Stream a, Stream b):合併a和b兩個流爲一個流
Stream<T> distinct():對流中的元素去重(根據Object.equals(Object) )組成的流
Stream<T> sorted():返回由此流的元素組成的流,根據自然順序排序
Stream<T> sorted(Comparator comparator):返回由該流的元素組成的流,根據提供的Comparator進行排序
Stream<R> map(Function mapper):將流中的數據轉換成另一種類型進行存儲,返回新的流對象。
Function轉換型接口中的方法 R apply(T t)
void forEach(Consumer action):遍歷消費流中的數據
long count():返回此流中的元素個數
3、將流中的數據轉換成集合(可選操作)
List<String> listA = streamA.collect(Collectors.toList());
Set<Integer> setB = streamB.collect(Collectors.toSet());