天天看點

記JDK8中,Stream 使用

1、Stream(流)介紹

Stream是一個來自資料源的元素隊列并支援聚合操作,元素是特定類型的對象,形成一個隊列。同時他不會儲存元素,而是按照要求計算 ,可以簡潔的對集合來進行資料的篩選、排序、提取等用途。

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

  • 流的來源: 可以是集合,數組,I/O channel, 産生器generator 等。
  • 聚合操作: 比如filter, map, reduce, find, match, sorted等。

2、Stream的使用

在 JDK8 中, 集合接口生成流:stream()【串行流】 parallelStream() 【并行流】

List<User> list = new ArrayList<User>();

List<User> users = list.stream()
					   .filter(p -> p.getUserId().equals("123"))
					   .limit(10)
					   .sorted()
					   .collect(Collectors.toList());
           

Stream :

filter :用于通過設定的條件過濾出元素

limit : 用于擷取指定數量的流

sorted : 用于對流進行排序

collect : 實作了很多歸約操作,例如将流轉換成集合和聚合元素

        Collectors.toList()

        Collectors.toMap()

        Collectors.toSet()

Stream 提供了 forEach 來疊代流中的每個資料
//列印所有資料
list.stream().forEach(System.out::println);
           

通過forEach,我們可以通過該方法來提取集合中泛型的某一個屬性

List<User> list = new ArrayList();
List<String> str = new ArrayList<String>();

   list.stream().forEach(p->{
       str.add(p.getUserId());
   });
           

還有簡單方式進行屬性的提取

① List<String> userIds =list.stream().map(u -> u.getUserId()).collect(Collectors.toList());
 
 ② List<String> userIds = list.stream().map(User::getUserId).collect(Collectors.toList());
           
進行求和、最大值、最小值、平均值
List<Integer> list = new ArrayList<Integer>();
IntSummaryStatistics collect = list.stream().collect(Collectors.summarizingInt(value -> value));
System.out.println(collect);
System.out.println("集合元素個數:" + collect.getCount());
System.out.println("總和:" + collect.getSum());
System.out.println("最小值:" + collect.getMax());
System.out.println("最大值:" + collect.getMin());
System.out.println("平均值:" + collect.getAverage());
           
List<Map<String,Object>>類型資料,想提取集合中某一key值的資料集合
List<Map<String, Object>> listMap = new ArrayList<Map<String, Object>>();

Optional<Map<String, Object>> any = listMap.stream().findAny();
	//isPresent() 與 obj != null 一緻,沒有差別
	if(any.isPresent()){
		str.add(any.get().get("key").toString());
	}
           

Optional也是JDK8的新特性,是Java8為了解決null值判斷問題,借鑒google guava類庫的Optional類而引入的一個同名Optional類,避免導緻空指針。

get()方法主要用于傳回包裝對象的實際值,但是如果包裝對象值為null,會抛出NoSuchElementException異常。

isPresent()方法用于判斷包裝對象的值是否非空。

1、轉JSONArray對象,collect(Collectors.toCollection(JSONArray::new));