共計 3537 個字符,預計需要花費 9 分鐘才能閱讀完成。
這篇文章主要介紹“java8 的新特性怎么使用”,在日常操作中,相信很多人在 java8 的新特性怎么使用問題上存在疑惑,丸趣 TV 小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”java8 的新特性怎么使用”的疑惑有所幫助!接下來,請跟著丸趣 TV 小編一起來學習吧!
1)Lambda 表達式
概念:java8 中增加了一個新的語法 --Lambda 表達式,并且引入了一個新的操作符(Lambda 操作符): -
Lambda 操作符 - : - 將 Lambda 表達式分為兩個部分:左側:指定了 Lambda 表達式需要的參數,參數的數據類型可以由編譯器的“類型推斷”機制推斷得出,故可以省略。右側:指定了 Lambda 表達式的方法體,即 Lambda 表達式要執行的功能。語法格式:格式一:無參數,無返回值
() - System.out.println( Hello Lambda!
格式二:有一個參數,并且無返回值
(x) - System.out.println(x)
格式三:若只有一個參數,小括號可以省略不寫
x - System.out.println(x)
格式四:有兩個以上的參數,有返回值,并且 Lambda 體中有多條語句
(x, y) - {
System.out.println( 函數式接口
return Integer.compare(x, y);
格式五:若 Lambda 體中只有一條語句, return 和 大括號都可以省略不寫
(x, y) - Integer.compare(x, y);
格式六:Lambda 表達式的參數列表的數據類型可以省略不寫,因為 JVM 編譯器通過上下文推斷出,數據類型,即“類型推斷”(Integer x, Integer y) - Integer.compare(x, y);
補充:java8 中,接口里可以有 default 方法 (默認方法) 和 static 方法(靜態方法),實現類默認會繼承 defaul 方法和 static 方法。聲明一個函數式接口:@FunctionalInterface
public interface FirstInterface {void run();
1)可以通過 Lambda 表達式來創建函數式接口的對象。2)可以在函數式接口上使用 @FunctionalInterface 注解,這樣我們就可以根據該注解來判斷這個接口是否是一個函數式接口。3)Java8 內置的四個核心函數式接口
函數式接口 參數類型 返回類型 抽象方法 用途
消費型接口:Consumer T T void void accept(T t) 對類型為 T 的對象執行某一操作。供給型接口:Supplier T 無 T T get() 返回類型為 T 的對象。函數型接口:Function T, R T R R apply(T t) 對類型為 T 的對象執行某一操作,并返回 R 類型的結果。斷言型接口:Predicate T T boolean boolean test(T t) 確定類型為 T 的對象是否滿足某約束,并返回 boolean 值。// 對 String 類型的對象執行 Lambda 表達式 (x - System.out.println(x)) 的方法體。Consumer String strConsumer = x - System.out.println(x); // 創建一個 Consumer(消費型接口)的對象
strConsumer.accept( Consumer 的 accept 方法!// 執行
FirstInterface firstObj = () - System.out.println( Hello Lambda!
firstObj.run();
1)若 Lambda 方法體中的功能,已經有方法提供了實現,則可以使用方法引用。2)使用操作符 :: 將方法名和對象或類的名字分隔開來。? 對象名 :: 實例方法名
? 類名 :: 靜態方法名
? 類名 :: 實例方法名
Comparator Integer com1 = (x, y) - Integer.compare(x, y);
Comparator Integer com2 = Integer::compare;
構造器引用
格式: 類名 :: new
Supplier Student sup1 = () - new Student();
Supplier Student sup2 = Student::new;
數組引用
格式: type[] :: new
Function Integer, String[] fun1 = (args) - new String[args];
Function Integer, String[] fun2 = String[]::new;
創建 Stream 的方式:1 通過 Collection 中的 stream() 或 parallelStream() 來創建一個 Stream
List String list = new ArrayList ();
Stream String stream = list.stream(); // 獲取一個順序流
Stream String parallelStream = list.parallelStream(); // 獲取一個并行流
2 通過 Arrays 中的 stream(T[] array)創建一個 Stream
3 通過 Stream 中的
of(T... values) 創建一個 Stream
generate(Supplier T s) 創建一個無限 Stream
iterate(final T seed, final UnaryOperator T f) 創建一個無限 Stream
Stream T filter(Predicate ? super T predicate) 從流中排除某些元素
Stream T limit(long n); 將流截斷,只保留流中的前 n 個元素
Stream T skip(long n); 將流中的前 n 個元素剔除掉
Stream T distinct(); 將流中的元素進行去重操作。根據元素的 hashCode()方法和 equals()方法來確定唯一性。Stream T sorted(); 將流中的元素進行自然排序
Stream T sorted(Comparator ? super T comparator); 將流中的元素按照指定的規則排序
R Stream R map(Function ? super T, ? extends R mapper);
1 說明:將流中的元素進行處理后,用新生成的元素代替原來的元素。注:新元素的類型與舊元素的類型可能不一樣。2 參數:一個函數式接口,用傳入的函數來生成新的元素。3 舉例:Stream String stream = strList.stream().map(String::toUpperCase);
R Stream R flatMap(Function ? super T, ? extends Stream ? extends R mapper);
說明:將流中的每個值都換成另一個流,然后把所有流連接成一個流。
R, A R collect(Collector ? super T, A, R collector);
1 說明:將流轉換為其它形式,將流中的元素進行分組、拼接等。2 舉例:List String list = strList.stream().map(String::toUpperCase).collect(Collectors.toList());
boolean allMatch(Predicate ? super T predicate); 檢查所有的元素是否都匹配
anyMatch 檢查是否有元素匹配
noneMatch 檢查是否有元素不匹配
Optional T findFirst(); 返回第一個元素
Optional T findAny(); 返回流中任意一個元素
long count(); 返回流中元素的總數
Optional T max(Comparator ? super T comparator); 返回流中最大的元素
Optional T min(Comparator ? super T comparator); 返回流中最小的元素
1 只有調用終端操作后,所有的中間操作才會去執行,若沒有調用終端操作,那么所有的中間操作都將不會執行,這種模式叫做 惰性求值。2 流只能使用一次,即只能調用一次終端操作。
到此,關于“java8 的新特性怎么使用”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注丸趣 TV 網站,丸趣 TV 小編會繼續努力為大家帶來更多實用的文章!
正文完