1.Lambda表達式(常用)
2.函數(shù)式接口
3.方法引用和構(gòu)造器引用
4.Stream API(常用)
5.接口中的默認方法和靜態(tài)方法
6.新時間日期API
7.其他新特新(Optional)
1.Lambda
Lambda是一個匿名函數(shù)沈自,我們可以把Lambda表達式理解為是一段可以傳遞的代碼(將代碼像數(shù)據(jù)一樣進行傳遞)酌儒。可以寫出更簡潔枯途,更靈活的代碼忌怎。
一,Lambda 表達式的基礎(chǔ)語法:Java8中引入了一?個新的操作符 "->" 該操作符為箭頭操作符或 Lambda操作符酪夷,箭頭操作符將Lambda表達式拆分成兩部分:
左側(cè):Lambda 表達式的參數(shù)列表
右側(cè):Lambda 表達式中所執(zhí)行的功能榴啸,即 Lambda體。
語法格式一:無參數(shù)晚岭,無返回值() -> System.out.println("Hello Lambda!" );
語法格式二:有一個參數(shù)鸥印,無返回值
(x) -> System.out.println(x)
語法格式三:有一個參數(shù),可以不加()
x -> System.out.println(x)
語法格式四:有兩個以上的參數(shù),有返回值库说,并且Lambda體中有多條語句
(x, y) -> { System.out.println("函數(shù)式接口"); return Integer.compare(x, y); };
語法格式五:相對于四 若Lambda體中只有一條語句狂鞋,return 和 {} 都可以省略不寫
(x, y) -> Integer.compare(x, y);
語法格式六:Lambda 表達式的參數(shù)列表的數(shù)據(jù)類型可以省略不寫, 因為JVM編譯器通過上下問推斷出數(shù)據(jù)類型璃弄, 即 "類型推斷"
(Integer x, Integer y) -> Integer.compare(x, y);
二要销,Lambda 表達式需要“函數(shù)式接口”的支持
函數(shù)式接口:接口中只有一個抽象方法的接口构回,稱為函數(shù)式接口夏块。可以使用@FunctionalInterface 修飾纤掸,來檢查是否是函數(shù)式接口
2.Java8 內(nèi)置的四大核心函數(shù)式接口
Consumer<T> : 消費型接口 void accept(T t); Supplier<T> : 供給型接口 T get(); Function<T脐供, R> : 函數(shù)型接口 R apply(T t); Predicater<T> : 斷言型接口 boolean test(T t);
3.方法引用和構(gòu)造器引用
一.方法引用:若lambda體中的內(nèi)容已經(jīng)有方法實現(xiàn)了,我們可以使用“方法引用”
主要有三種語法格式:
①對象::實列方法名
②類::靜態(tài)方法名
③類::實列方法名
注意:
①Lambda體中調(diào)用方法的參數(shù)列表與返回值類型借跪,要與函數(shù)式接口中抽象方法的>函數(shù)列表和返回值類型保持一致
②若Lambda 參數(shù)列表中的第一個參數(shù)是實列方法的調(diào)用者,而第二個參數(shù)是實列方>法的參數(shù)時政己,可以使用 類::實列方法名對象::實列方法名 Consumer<String> consumer1 = System.out::println; 類::靜態(tài)方法名 Comparator<Integer> comparator1 = Integer::compare; 類::實列方法名 BiPredicate<String, String> predicate = String::equals;
二.構(gòu)造器引用
格式:
類::new
注意:需要調(diào)用的構(gòu)造器的參數(shù)列表要與函數(shù)式接口中抽象方法的參數(shù)列表保持一致Supplier<String> supplier = String::new;
三.數(shù)組引用
Function<Integer, String[]> function = String[]::new;
四.Stream(流)
Stream是數(shù)據(jù)渠道,用于操作數(shù)據(jù)源(集合掏愁,數(shù)組等)所生成的元素序列歇由。
"集合講的是數(shù)據(jù),流講的是計算"
注意:
①Stream自己不會存儲元素
②Stream不會改變源對象果港,相反沦泌,它會返回持有結(jié)果的新Stream
③Stream操作是延遲執(zhí)行的,它會等到需要結(jié)果時才執(zhí)行一.Stream操作的三個步驟:創(chuàng)建Stream->中間操作->終止操作
// 1.可以通過Collection系列集合提供的stream() 或 paralleStream() 獲取集合流 List<String> strings = new ArrayList<>(); Stream<String> stream = strings.stream();// 串行 Stream<String> stream1 = strings.parallelStream();// 并行 // 2.通過Arrays中靜態(tài)方法stream()獲取數(shù)組流 String[] array = new String[10]; Stream<String> stream2 = Arrays.stream(array); // 3. 通過Stream類中靜態(tài)方法of() 獲取流 Stream<String> stringStream = Stream.of("1", "2", "3"); // 4.創(chuàng)建無限流 // 4.1 迭代 Stream<Integer> iterate = Stream.iterate(0, x -> x + 3); iterate.forEach(System.out::println); iterate.limit(10).forEach(System.out::println);// limit中間操作 // 4.2 生成 Stream<Double> generate = Stream.generate(() -> Math.random()); generate.forEach(System.out::println);