package com.wjk.demo.test;
import java.util.*;
import java.util.stream.Collectors;
/**
* java 8 新特性Demo-Stream
* Stream(流)是一個來自數據源的元素隊列並支持聚合操作
* 元素:是特定類型的對象,形成一個隊列。Java中的Stream並不會存儲元素,而是按需計算。
* 數據源 :流的來源。可以是集合,數組,I/O channel,產生器generator等。
* 聚合操作: 類似SQL語句一樣的操作,比如filter, map, reduce, find,match, sorted等。
* 基本特性:1、PipeLining:中間操作都會返回流對象本身;
* 2、內部迭代:以前對集合遍歷都是通過Iterator或者For-Each的方式,
顯式的在集合外部進行迭代,這叫做外部迭代
*/
public class java8TestDemo {
public static void main(String[] args) {
//生成流,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' 迭代流中的每個數據。使用forEach 輸出了10個隨機數
* limit 方法用於獲取指定數量的流。
* map 方法用於映射每個元素到對應的結果.
* filter 方法用於通過設置條件過濾出元素
* sorted 方法用於對流進行排序
* Collectors 類實現了很多歸約操作,例如將流轉換成集合和聚合元素。
Collectors可用於返回列表或字符串:
*/
// 'forEach' 來迭代流中的每個數據。使用forEach 輸出了隨機數,limit 方法用於限制數據數量
//Random random = new Random();
//random.ints(10,100).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());
//System.out.println(squaresList);
//使用filter 方法過濾出空字符串:
List<String> strs = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl");
int count = (int) strs.stream().filter(string -> string.isEmpty()).count();
//System.out.println("空串數量"+count);
//sorted 方法對輸出的 10 個隨機數進行排序
Random random = new Random();
//random.ints(20,100).limit(10).sorted().forEach(System.out::println);
//將流轉換成集合和聚合元素。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(s -> !s.isEmpty()).collect(Collectors.joining(", "));
//System.out.println("合併字符串: " + mergedString);
List<Map<String,Object>> listMap = new ArrayList<>();
for (int i=0;i<5;i++){
Map<String, Object> map = new HashMap<>();
map.put("x","1"+i);
map.put("y","y"+i);
listMap.add(map);
}
System.out.println(listMap);
/**
* 使用toMap()函數之後,返回的就是一個Map了,自然會需要key和value。
toMap()的第一個參數就是用來生成key值的,第二個參數就是用來生成value值的。
第三個參數用在key值衝突的情況下:如果新元素產生的key在Map中已經出現過了,
第三個參數就會定義解決的辦法。
*/
Map<String, String> map1 = listMap.stream().
filter(s -> s.get("x").equals("10"))
.collect(Collectors.
toMap(s->(String)s.get("x"),s->(String)s.get("y"),(s1,s2)->s1));
System.out.println(map1);
}
}