1. 程式人生 > 實用技巧 >特定環境下的C知識點應用

特定環境下的C知識點應用

Java8 新增了非常多的特性,我們主要討論以下幾個:

  • Lambda 表示式− Lambda 允許把函式作為一個方法的引數(函式作為引數傳遞到方法中)。

  • 方法引用− 方法引用提供了非常有用的語法,可以直接引用已有Java類或物件(例項)的方法或構造器。與lambda聯合使用,方法引用可以使語言的構造更緊湊簡潔,減少冗餘程式碼。

  • 預設方法− 預設方法就是一個在接口裡面有了一個實現的方法。

  • 新工具− 新的編譯工具,如:Nashorn引擎 jjs、 類依賴分析器jdeps。

  • Stream API−新新增的Stream API(java.util.stream) 把真正的函數語言程式設計風格引入到Java中。

  • Date Time API− 加強對日期與時間的處理。

  • Optional 類− Optional 類已經成為 Java 8 類庫的一部分,用來解決空指標異常。

  • Nashorn, JavaScript 引擎− Java 8提供了一個新的Nashorn javascript引擎,它允許我們在JVM上執行特定的javascript應用。

import java.util.Collections;
import java.util.List;
import java.util.ArrayList;
import java.util.Comparator;
 
public class
Java8Tester { public static void main(String args[]){ List<String> names1 = new ArrayList<String>(); names1.add("Google "); names1.add("Runoob "); names1.add("Taobao "); names1.add("Baidu "); names1.add("Sina "); List<String> names2 = new
ArrayList<String>(); names2.add("Google "); names2.add("Runoob "); names2.add("Taobao "); names2.add("Baidu "); names2.add("Sina "); Java8Tester tester = new Java8Tester(); System.out.println("使用 Java 7 語法: "); tester.sortUsingJava7(names1); System.out.println(names1); System.out.println("使用 Java 8 語法: "); tester.sortUsingJava8(names2); System.out.println(names2); } // 使用 java 7 排序 private void sortUsingJava7(List<String> names){ Collections.sort(names, new Comparator<String>() { @Override public int compare(String s1, String s2) { return s1.compareTo(s2); } }); } // 使用 java 8 排序 private void sortUsingJava8(List<String> names){ Collections.sort(names, (s1, s2) -> s1.compareTo(s2)); } }

Java Lambda 表示式

Lambda 表示式,也可稱為閉包,它是推動 Java 8 釋出的最重要新特性。

Lambda 允許把函式作為一個方法的引數(函式作為引數傳遞進方法中)。

使用 Lambda 表示式可以使程式碼變的更加簡潔緊湊。

lambda 表示式的語法格式如下:

(parameters) -> expression(parameters) ->{ statements; }

Lambda 表示式例項

Lambda 表示式的簡單例子:

// 1. 不需要引數,返回值為 5  
() -> 5  
  
// 2. 接收一個引數(數字型別),返回其2倍的值  
x -> 2 * x  
  
// 3. 接受2個引數(數字),並返回他們的差值  
(x, y) -> x – y  
  
// 4. 接收2個int型整數,返回他們的和  
(int x, int y) -> x + y  
  
// 5. 接受一個 string 物件,並在控制檯列印,不返回任何值(看起來像是返回void)  
(String s) -> System.out.print(s)
public class Java8Tester {
   public static void main(String args[]){
      Java8Tester tester = new Java8Tester();
        
      // 型別宣告
      MathOperation addition = (int a, int b) -> a + b;
        
      // 不用型別宣告
      MathOperation subtraction = (a, b) -> a - b;
        
      // 大括號中的返回語句
      MathOperation multiplication = (int a, int b) -> { return a * b; };
        
      // 沒有大括號及返回語句
      MathOperation division = (int a, int b) -> a / b;
        
      System.out.println("10 + 5 = " + tester.operate(10, 5, addition));
      System.out.println("10 - 5 = " + tester.operate(10, 5, subtraction));
      System.out.println("10 x 5 = " + tester.operate(10, 5, multiplication));
      System.out.println("10 / 5 = " + tester.operate(10, 5, division));
        
      // 不用括號
      GreetingService greetService1 = message ->
      System.out.println("Hello " + message);
        
      // 用括號
      GreetingService greetService2 = (message) ->
      System.out.println("Hello " + message);
        
      greetService1.sayMessage("Runoob");
      greetService2.sayMessage("Google");
   }
    
   interface MathOperation {
      int operation(int a, int b);
   }
    
   interface GreetingService {
      void sayMessage(String message);
   }
    
   private int operate(int a, int b, MathOperation mathOperation){
      return mathOperation.operation(a, b);
   }
}

Java 8 Stream

Java 8 API添加了一個新的抽象稱為流Stream,可以讓你以一種宣告的方式處理資料。

Stream 使用一種類似用 SQL 語句從資料庫查詢資料的直觀方式來提供一種對 Java 集合運算和表達的高階抽象。

Stream API可以極大提高Java程式設計師的生產力,讓程式設計師寫出高效率、乾淨、簡潔的程式碼。

這種風格將要處理的元素集合看作一種流, 流在管道中傳輸, 並且可以在管道的節點上進行處理, 比如篩選, 排序,聚合等。

生成流

在 Java 8 中, 集合介面有兩個方法來生成流:

  • stream()− 為集合建立序列流。

  • parallelStream()− 為集合建立並行流。

List<String> strings = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl");
List<String> filtered = strings.stream().filter(string -> !string.isEmpty()).collect(Collectors.toList());

forEach

Stream 提供了新的方法 'forEach' 來迭代流中的每個資料。以下程式碼片段使用 forEach 輸出了10個隨機數

Random random = new Random();
random.ints().limit(10).forEach(System.out::println);

Map

map方法用於對映每個元素到對應的結果,一下程式碼片段使用map輸出了元素的對應的平方數

List<Integer> numbers  = Arrays.asList(3,2,2,3,7,3,5);
//獲取對應的平方數
List<Integer> squaresList = numbers.stream().map(i -> i*i).distinct().collect(Collectors.toList());

filter

List<String> strings = Arrays.asList("abc","","b","efg","abcd","","jk1");
//獲取空字串的數量
long count = Strings.stream().filter(string ->string.isEmpt()).count();

limit

limit 方法用於獲取指定數量的流。 以下程式碼片段使用 limit 方法打印出 10 條資料:

Random random = new Random(); random.ints().limit(10).forEach(System.out::println);

sorted

sorted 方法用於對流進行排序。以下程式碼片段使用 sorted 方法對輸出的 10 個隨機數進行排序:

Random random = new Random(); random.ints().limit(10).sorted().forEach(System.out::println);

並行(parallel)程式

parallelStream 是流並行處理程式的代替方法。以下例項我們使用 parallelStream 來輸出空字串的數量:

List<String> strings = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl"); 

// 獲取空字串的數量
long count = strings.parallelStream().filter(string -> string.isEmpty()).count();