1. 程式人生 > >基礎篇--Java 8實用程式碼塊

基礎篇--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 方法引用

方法引用通過方法的名字來指向一個方法。

方法引用可以使語言的構造更緊湊簡潔,減少冗餘程式碼。

方法引用使用一對冒號(::)。

靜態方法引用:它的語法是Class::static_method

特定類的任意物件的方法引用:它的語法是Class::method

特定物件的方法引用:它的語法是instance::method

構造器引用:它的語法是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() );