Java的Stream表達式


1、如何理解Stream


Java8新特性

Stream可以理解為管道,管道里的流水就是數據,管道里可以對水進行處理,如過濾,消毒,凈化等等操作。最后流出的水才能喝。

所以我理解Stream關注的是對數據的加工計算。對比java集合框架,集合框架關注的是如何存取數據。

一個stream操作主要有3個部分:源頭、中間操作、終止操作。

中間操作可以有0個或多個 但不是立馬執行的,只有終止操作被調用后中間操作才會一起執行(惰性執行)

有了stream操作后 會簡化我們的操作,如循環

如循環一個數組,打印,如下操作,而非原來的for循環,是否很簡潔

int[] intArray = new int[]{2,4,6,1};
Arrays.stream(intArray).forEach(System.out::println);

  

2、Stream來源


 

 stream主要來源:數組 集合 

數組:

int[] intArray = new int[]{2,4,6,1};
Arrays.stream(intArray).forEach(System.out::println);
Stream.of(intArray).forEach(System.out::println);

 

 

集合Collection

 

strList.stream().forEach(System.out::println);
Stream.of(strList).forEach(System.out::println);

  

3、中間操作


 主要有filter map flatmap sorted skip limit distinct

例:

public static void main(String[] args) {
        List<String> strList = Arrays.asList("yy","ff","dd","11","12","##");
        strList.stream().filter(x->x.matches("^\\w.*")).
                map(x->x+"end").sorted().skip(1).limit(2).distinct().forEach(System.out::println);
    }

輸出:

12end
ddend

  

 主要說明下flatmap 這個是把流的每個元素映射為一個stream ,再把所有的stream連到一起(扁平化操作),例:

strList.stream().flatMap(x->Stream.of(x.split(","))).forEach(System.out::println);

 

每次中間操作都會產生一個新的stream  

 

4、終止操作


主要有:

reduce,foreach,collect

allMatch,anyMatch,noneMatch

findFirst,findAny

max,min,count

 例:

import java.util.*;
import java.util.stream.Collectors;

class StreamMode{
    private String name;
    private int age;

    public StreamMode(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "StreamMode{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}
public class StreamYf {
    public static void main(String[] args) {
        List<StreamMode> strList = new ArrayList<>();
        StreamMode streamMode1 = new StreamMode("y1",21);
        StreamMode streamMode2 = new StreamMode("y3",22);
        StreamMode streamMode3 = new StreamMode("y2",23);
        StreamMode streamMode4 = new StreamMode("y4",20);
        StreamMode streamMode5 = new StreamMode("y5",19);

        strList.add(streamMode1);
        strList.add(streamMode2);
        strList.add(streamMode3);
        strList.add(streamMode4);
        strList.add(streamMode5);

        //map reduce(lamdba需要兩個參數)
        Optional<Integer> reduce = strList.stream().map(StreamMode::getAge).reduce(Integer::sum);
        System.out.println(reduce.get());

        //allMatch 全部匹配 (anyMatch noneMatch用法一樣)
        boolean resultAllMatch = strList.stream().allMatch(x -> x.getAge() > 20);
        System.out.println("resultAllMatch="+resultAllMatch);

        //findFirst找出排序后的第一個元素(降序即從大到小)
        Optional<StreamMode> firstEle = strList.stream().sorted(Comparator.comparingInt(StreamMode::getAge).reversed()).findFirst();
        System.out.println("firstEle="+firstEle.get());

        //findAny找出任一個元素
        Optional<StreamMode> anyEle = strList.stream().findAny();
        System.out.println("anyEle="+anyEle.get());

        //找出最大的元素 min類似
        Optional<Integer> maxAge = strList.stream().map(StreamMode::getAge).max(Integer::max);
        System.out.println("maxAge="+maxAge.get());

        //統計過濾后元素的個數
        long count = strList.stream().filter(x -> x.getAge() > 20).count();
        System.out.println("count="+count);

        //collect 收集后轉為List toSet類似用法
        List<Integer> collectList = strList.stream().map(StreamMode::getAge).collect(Collectors.toList());
        System.out.println("collectList="+collectList);

        //collect 收集后轉為Map
        Map<String, List<StreamMode>> collectMap = strList.stream().collect(Collectors.groupingBy(StreamMode::getName));
        System.out.println("collectMap="+collectMap);

        //collect 收集后求平均年齡 sum max 類似
        Double collectAvg = strList.stream().collect(Collectors.averagingInt(StreamMode::getAge));
        System.out.println("collectAvg="+collectAvg);
        //collect 獲取SummaryStatistics 可以一次性獲取max min sum等
        IntSummaryStatistics collectAll = strList.stream().collect(Collectors.summarizingInt(StreamMode::getAge));
        System.out.println("collectAvg2="+collectAll.getAverage());
        System.out.println("collectCount2="+collectAll.getCount());
    }
}

 

5、並發stream


paralleStream基於ForkJoin(把大任務拆為多個子任務計算再合並)可以實現並行stream

並非線程安全 慎用


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM