package com.xiangshuai.lambda; import java.util.*; import java.util.regex.Pattern; import java.util.stream.Collectors; import java.util.stream.Stream; /** * @author lqx * @ClassName StreamDemo1 * @description 參考網址 https://www.runoob.com/java/java8-streams.html * 一、Stream介紹: * Stream API是JDK8新添加的處理集合的關鍵組件,提供了多種的函數式操作。 引入全新的Stream API。這裏的流Stream和I/O流不同,它更像具有Iterable的集合類,但行爲和集合類又有所不同。 Stream是對集合對象功能的增強,它專注於對集合對象進行各種非常便利、高效的聚合操作,或者打批量數據操作。 只要給出需要對其包含的元素執行什麼操作,比如“過濾掉長度大於10的字符串”、“獲取每個字符串的首字母”等,Stream會隱式地在內部進行遍歷,做出相應的數據轉換。 Java有關List的stream基本操作 Stream使用一種類似用SQL語句從數據庫查詢數據的直觀方式來提供一種對Java集合運算和表達的高階抽象。 這種風格將要處理的元素集合看作一種流,流在管道中傳輸,並且可以在管道的節點上進行處理,比如篩選、排序、聚合等。 和以前的collection操作不同,Stream操作還有兩個基礎的特徵: Pipelining:中間操作都會返回流對象本身。這樣多個操作可以串聯成一個管道,如同流式風格。這樣做可以對操作進行優化,比如延遲執行和短路。 內部迭代:以前對集合遍歷都是通過Iterator或者ForEach的方式,顯示的在集合外部進行迭代,這叫做外部迭代。Stream提供了內部迭代的方式,通過訪問者模式實現。 一些方法: stream();爲集合創建串行流。 parallelStream(),爲集合創建並行流。是流並行處理程序的代替方法。 forEach(),Stream提供的新的方法來迭代流中的每個數據。 map(),方法用於映射每個元素到對應的結果。map(i -> i*i)集合中的每個元素變爲平方 filter(),方法用於通過設置的條件過濾出元素,filter(string -> string.isEmpty()) 過濾出空字符串。 limit(),方法用於獲取指定數量的流。limit(10) 獲取10條數據 sorted(),方法用於對流進行排序。 collect(Collectors.toList()),用於返回列表或字符串,Collectors.joining(",");將集合轉換成逗號隔開的字符串 二、Stream常見操作API介紹 1.聚合操作 2.stream的處理流程 2.1 獲取數據源 2.1 數據轉換 2.3 獲取結果 3. 獲取Stream對象 3.1 從集合或數組中獲取 Collections.stream()如list.stream() Collections.parallelStream()如list.parallelStream() Arrays.stream() 3.2 BufferReader 3.3 靜態工廠 java.util.stream..IntStream.range(, ) java.nio.file..Files.walk() 3.4 自定構建 java.util..Spliterator 3.5 更多的方式.. * @date 2020/6/21 16:33 */ public class StreamDemo1 { public static void main(String[] args) { //查filter()過濾出字符串大於10的集合元素 List<String> list=new ArrayList<>(); list.add("123");list.add("你好123");list.add("你好123---sssssssssss"); list.add("你好123---sssscccc"); list.add("你好123"); //先filter過濾後的stream用collect方法轉成list list.stream().filter(str->str.length()>10).collect(Collectors.toList()); System.out.println(list); //map--將list裏的對象id和對象弄成key,value List<Order> orders=new ArrayList<>(); StreamDemo1 streamDemo1 = new StreamDemo1(); orders.add(streamDemo1.new Order(1,"商品1")); orders.add(streamDemo1.new Order(2,"商品2")); orders.add(streamDemo1.new Order(3,"商品3")); // 第一個參數Order::getId 表示選擇Order的getId作爲map的key值; // 第二個參數v -> v表示選擇將原來的對象作爲map的value值; // 第三個參數(v1, v2) -> v1中,如果v1與v2的key值相同,選擇v1作爲那個key所對應的value值 Map<Integer, Order> collect = orders.stream().collect(Collectors.toMap(Order::getId, c -> c, (k1, k2) -> k2)); Set<Integer> integers = collect.keySet(); integers.stream().forEach(id->{ System.out.println(collect.get(id)); }); //將一個List對象的id用逗號連起來 String ids = orders.stream().map(Order::getId).map(String::valueOf).collect(Collectors.joining(",")); System.out.println(ids); } class Order{ private int id; private String name; public int getId() { return id; } public void setId(int id) { this.id = id; } public Order(int id, String name) { this.id = id; this.name = name; } public Order() { } @Override public String toString() { return "Order{" + "id=" + id + ", name='" + name + '\'' + '}'; } public String getName() { return name; } public void setName(String name) { this.name = name; } } }
stream簡單操作
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.