1.8新特性 lambda表達式 資料: 1. Consumer接口 https://blog.csdn.net/qq_28410283/article/details/80618456
2.java8 Lambda表達式簡介 https://blog.csdn.net/qq_28410283/article/details/80961022
3.菜鳥教程 Java 8 Lambda 表達式 https://www.runoob.com/java/java8-lambda-expressions.html
Consumer 語義是消費的意思, public interface Consumer<T> { void accept(T t); //消費 //主要是對入參做一些列的操作,在stream里,主要是用於forEach;內部迭代的時候,對傳入的參數,做一系列的業務操作,沒有返回值;
default Consumer<T> andThen(Consumer<? super T> after) //傳入一個Consumer類型的參數,它的泛型類型, //跟本接口是一致的T,先做本接口的accept操作, //然后在做傳入的Consumer類型的參數的accept操作
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) 使用 Lambda 表達式需要注意以下兩點: Lambda 表達式主要用來定義行內執行的方法類型接口,例如,一個簡單方法接口。在上面例子中,我們使用各種類型的Lambda表達式來定義MathOperation接口的方法。然后我們定義了sayMessage的執行。 Lambda 表達式免去了使用匿名方法的麻煩,並且給予Java簡單但是強大的函數化的編程能力。 變量作用域 lambda 表達式只能引用標記了 final 的外層局部變量,這就是說不能在 lambda 內部修改定義在域外的局部變量,否則會編譯錯誤。 lambda 表達式的局部變量可以不用聲明為 final,但是必須不可被后面的代碼修改(即隱性的具有 final 的語義) stream流操作 資料: 1.Java的Stream流式處理 https://blog.csdn.net/qq_20989105/article/details/81234175
2.Java 8 Stream | 菜鳥教程 //實際使用教程
https://www.runoob.com/java/java8-streams.html
簡介: Java 8 中的 Stream 是對集合(Collection)對象功能的增強,它專注於對集合對象進行各種非常便利、高效的聚合操作(aggregate operation), 或者大批量數據操作 (bulk data operation)。Stream API 借助於同樣新出現的Lambda表達式,極大的提高編程效率和程序可讀性。同時它提供串行 和並行兩種模式進行匯聚操作,並發模式能夠充分利用多核處理器的優勢,使用fork/join並行方式來拆分任務和加速處理過程。通常編寫並行代碼很 難而且容易出錯, 但使用Stream API無需編寫一行多線程的代碼,就可以很方便地寫出高性能的並發程序。所以說,Java 8 中首次出現的 java.util.stream 是一個函數式語言+多核時代綜合影響的產物。 順序: | stream of elements +-----> |filter+-> |sorted+-> |map+-> |collect| 生成流 集合接口有兩個方法來生成流: 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 Random random = new Random(); random.ints().limit(10).forEach(System.out::println); 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 方法用於通過設置的條件過濾出元素。以下代碼片段使用 filter 方法過濾出空字符串: limit 方法用於獲取指定數量的流。 以下代碼片段使用 limit 方法打印出 10 條數據: sorted 方法用於對流進行排序。以下代碼片段使用 sorted 方法對輸出的 10 個隨機數進行排序: Random random = new Random(); random.ints().limit(10).sorted().forEach(System.out::println); parallelStream 並行程序 流並行處理程序的代替方法。以下實例我們使用 parallelStream 來輸出空字符串的數量 List<String> strings = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl"); // 獲取空字符串的數量
int count = strings.parallelStream().filter(string -> string.isEmpty()).count(); Collectors Collectors 類實現了很多歸約操作,例如將流轉換成集合和聚合元素。Collectors 可用於返回列表或字符串: List<String>strings = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl"); List<String> filtered = strings.stream().filter(string -> !string.isEmpty()).collect(Collectors.toList()); System.out.println("篩選列表: " + filtered); String mergedString = strings.stream().filter(string -> !string.isEmpty()).collect(Collectors.joining(", ")); System.out.println("合並字符串: " + mergedString); 統計 另外,一些產生統計結果的收集器也非常有用。它們主要用於int、double、long等基本類型上,它們可以用來產生類似如下的統計結果。 List<Integer> numbers = Arrays.asList(3, 2, 2, 3, 7, 3, 5); IntSummaryStatistics stats = numbers.stream().mapToInt((x) -> x).summaryStatistics(); System.out.println("列表中最大的數 : " + stats.getMax()); System.out.println("列表中最小的數 : " + stats.getMin()); System.out.println("所有數之和 : " + stats.getSum()); System.out.println("平均數 : " + stats.getAverage());