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));