基礎篇--Java 8實用程式碼塊
Java 8 新特性
Java 8 (又稱為 jdk 1.8) 是 Java 語言開發的一個主要版本。
新特性
Java8 新增了非常多的特性,我們主要討論以下幾個:
l Lambda 表示式 − Lambda允許把函式作為一個方法的引數
l 方法引用 − 方法引用提供了非常有用的語法,可以直接引用已有Java類或物件(例項)的方法或構造器。與lambda聯合使用,方法引用可以使語言的構造更緊湊簡潔,減少冗餘程式碼。
l 預設方法 − 預設方法就是一個在接口裡面有了一個實現的方法。
l 新工具 − 新的編譯工具,如:Nashorn引擎 jjs、 類依賴分析器jdeps。
l Stream API −新新增的Stream API(java.util.stream) 把真正的函數語言程式設計風格引入到Java中。
l Date Time API − 加強對日期與時間的處理。
l Optional 類 − Optional 類已經成為 Java 8 類庫的一部分,用來解決空指標異常。
l Nashorn, JavaScript 引擎 − Java 8提供了一個新的Nashorn javascript引擎,它允許我們在JVM上執行特定的javascript應用。
Java 8 Lambda 表示式
Lambda 表示式,也可稱為閉包,它是推動 Java 8 釋出的最重要新特性。
Lambda 允許把函式作為一個方法的引數(函式作為引數傳遞進方法中)。
使用 Lambda 表示式可以使程式碼變的更加簡潔緊湊。
以下是lambda表示式的重要特徵:
· 可選型別宣告:不需要宣告引數型別,編譯器可以統一識別引數值。
· 可選的引數圓括號:一個引數無需定義圓括號,但多個引數需要定義圓括號。
· 可選的大括號:如果主體包含了一個語句,就不需要使用大括號。
· 可選的返回關鍵字:如果主體只有一個表示式返回值則編譯器會自動返回值,大括號需要指定明表示式返回了一個數值。
Java 8 方法引用
方法引用通過方法的名字來指向一個方法。
方法引用可以使語言的構造更緊湊簡潔,減少冗餘程式碼。
方法引用使用一對冒號(::)。
l 靜態方法引用:它的語法是Class::static_method
l 特定類的任意物件的方法引用:它的語法是Class::method
l 特定物件的方法引用:它的語法是instance::method
l 構造器引用:它的語法是Class::new,或者更一般的Class< T >::new
Java 8 Stream
Java 8 API添加了一個新的抽象稱為流Stream,可以讓你以一種宣告的方式處理資料。
Stream 使用一種類似用 SQL 語句從資料庫查詢資料的直觀方式來提供一種對 Java 集合運算和表達的高階抽象。
Stream API可以極大提供Java程式設計師的生產力,讓程式設計師寫出高效率、乾淨、簡潔的程式碼。
這種風格將要處理的元素集合看作一種流, 流在管道中傳輸, 並且可以在管道的節點上進行處理, 比如篩選, 排序,聚合等。
元素流在管道中經過中間操作(intermediate operation)的處理,最後由最終操作(terminal operation)得到前面處理的結果。
什麼是 Stream?
Stream(流)是一個來自資料來源的元素佇列並支援聚合操作
Java 8 Optional 類
Optional 類是一個可以為null的容器物件。如果值存在則isPresent()方法會返回true,呼叫get()方法會返回該物件。
Optional 是個容器:它可以儲存型別T的值,或者僅僅儲存null。Optional提供很多有用的方法,這樣我們就不用顯式進行空值檢測。
Optional 類的引入很好的解決空指標異常。
下面是我整理的自己常用到java8程式碼塊,與大家分享一下:
//count
long count=words.stream().filter(w->w.length()>2).count();
//分割槽
Map<Boolean, List<BillGroupingDto>> parts = finalDiff.stream().collect(Collectors.partitioningBy(x -> productTypeIds.contains(x.getProductTypeId())));
//擷取條數
Stream<Double> randoms=Stream.generate(Math::random).limit(20);
randoms.forEach(System.out::println);
//返回型別值
List<Integer> userIds = users.stream().map(f -> { return f.getId(); }).collect(Collectors.toList());
userIds.forEach(System.out::println);
//排序
List<String> words = Arrays.asList("asdasd", "hgjgh", "cvbvn", "ewrwer", "asdasdasd", "e", "wer", "asdasdasd");
words=words.stream().sorted(Comparator.comparing(String::length)).collect(Collectors.toList());
words.forEach(System.out::println);
//排序:
productSubTypeDtos = productSubTypeDtos
.stream()
.sorted(Comparator.comparing(ProductSubTypeDto::getProductType)
.collect(Collectors.toList());
//兩次排序:
List<ChargeRuleLogRs>sortedTotalChargeRuleLogRses=
totalChargeRuleLogRses
.stream()
.sorted(Comparator.comparingInt(ChargeRuleLogRs::getMonth)
.reversed().thenComparing(
Comparator.comparingLong(ChargeRuleLogRs::getVer)
.reversed()))
.collect(Collectors.toList());
//過濾:
List<ChargeRuleLog> filteredChargeRuleLogs =
chargeRuleLogs.stream()
.filter(b -> b.getProductTypeCode().toUpperCase()
.contains(productType.toUpperCase()))
.collect(Collectors.toList());
final Collection< String > result = tasks
.stream() // Stream< String >
.mapToInt( Task::getPoints ) // IntStream
.asLongStream() // LongStream
.mapToDouble( points -> points / totalPoints ) // DoubleStream
.boxed() // Stream< Double >
.mapToLong( weigth -> ( long )( weigth * 100 ) ) // LongStream
.mapToObj( percentage -> percentage + "%" ) // Stream< String>
.collect( Collectors.toList() );