stream簡單操作

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;
        }
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章