一文了解:JDK8的Stream流操做以及lambda表達式

Lambda Jdk8

Lambda 是一個匿名函數,只關注參數列表和方法體,咱們能夠把 Lambda表達式理解爲是一段能夠傳遞的代碼(將代碼像數據同樣進行傳遞)java

類型推斷:省略參數類型算法

與內部類比較

內部類this關鍵字指向內部類自己,Lambda中this指向lambda所處在的類express

Java編譯器將lambda表達式編譯成類的私有方法。使用了Java 7的 invokedynamic 字節碼指令來動態綁定這個方法。數組

表達式

引入了->新操做符:參數表加操做體數據結構

(Parameters)->{expressions}複製代碼

方法引用

類名 :: 方法名ide

功能接口(使用要求)

使用@FunctionalInterface註解函數

接口中的抽象方法只能是一個(函數式接口)this

Predicate

java.util.function.Predicate函數式接口,向API方法添加邏輯,很是適合作過濾器spa

List<String> names=Arrays.asList("dx","wdt","zfb","wuguangyao","nihaoshiw"));
        Predicate<String> filter1 = str->str.length()>5;
        Predicate<String> filter2 = str->str.endsWith("yao");
       // filter(names,(n)->((String)n).startsWith("d"));
        filter(names,filter2);
        names.stream().filter(filter1.and(filter2))
                .forEach(System.out::println);
    }

    public static void filter(List<String> list, Predicate condition){
        for(String str:list){
            if(condition.test(str)){
                System.out.println(str);
            }
        }
    }複製代碼

Runnable

Runnable t = ()-> System.out.println("hello");
        t.run();複製代碼

s線程

Collections

根接口

sort

implements Comparable

實體類實現Comparable接口

public class Student implements Comparable<Student> {
~~~~
@Override
    public int compareTo(Student o) {
        return stuId.compareTo(o.getStuId());
    }複製代碼

Collections.sort(List ,new Comparator())

建立一個比較器實現Comparator接口

Collections.sort(list, new Comparator<StudentNoSort>() {
            @Override
            public int compare(StudentNoSort o1, StudentNoSort o2) {
                return o1.getStuId().compareTo(o2.getStuId());
            }
        });複製代碼

Stream

使用Jdk8 Stream更加簡單

List<StudentNoSort> streamList = list.stream()
                .filter(w -> w.getClass()==StudentNoSort.class)
                .sorted(((o1, o2) -> o1.getStuId().compareTo(o2.getStuId())))
                .collect(Collectors.toList());複製代碼

Stream

Stream 不是集合元素,它不是數據結構並不保存數據,它是有關算法和計算的,它更像一個高級版本的 Iterator。原始版本的 Iterator,用戶只能顯式地一個一個遍歷元素並對其執行某些操做;高級版本的 Stream,用戶只要給出須要對其包含的元素執行什麼操做,好比 「過濾掉長度大於 10 的字符串」、「獲取每一個字符串的首字母」等,Stream 會隱式地在內部進行遍歷,作出相應的數據轉換。

Stream構成

獲取一個數據源(source)→ 數據轉換→執行操做(返回新的Stream對象),這就容許對其操做能夠像鏈條同樣排列,變成一個管道

1561548534995

Stream Source

集合,數組,I/O channel, 產生器generator 等

Stream Operation

Intermediate

一個流能夠後面跟隨零個或多個 intermediate 操做。其目的主要是打開流,作出某種程度的數據映射/過濾,而後返回一個新的流,交給下一個操做使用。

collect

建立一個List

filter

過濾器:集合進行過濾操做

distinct

集合元素去重

map

對函數進行操做

reduce

組合元素

forEach

遍歷元素

limit

限定流中數據的數量

sorted

排序 使用Comparator接口

march,allMatch,noneMatch,anyMatch

符合元素傳入predicate,返回boolean

還有如下

mapToInt (轉換爲int), summaryStatistics(int型變量統計) ,sum(int型求和)

Terminal

一個流只能有一個 terminal 操做,當這個操做執行後,流就被使用「光」了,沒法再被操做。

構造Stream

Collections

Collections
List<String> list = Arrays.asList(strArray);
stream = list.stream();複製代碼

example:

List<Integer> list = new ArrayList<>(Arrays.asList(1, 2, 12, 1, 1, 2, 3, 2, 432, 4, 32, 54, 3, 3));
        int sum = list.stream().map(x -> x * x)
                .reduce((x, y) -> x + y)
                .get();複製代碼

遍歷文件(nio+lambda)

Path start = FileSystems.getDefault().getPath("/home/dzou/報告/模電");
        Files.walk(start)
                .filter(path -> path.toFile().isFile())
                .filter(path -> path.toString().endsWith(".jpg"))
                .forEach(System.out::println);複製代碼

時間複雜度

Stream 裏有個操做函數的集合,每次轉換操做就是把轉換函數放入這個集合中,在 Terminal 操做的時候循環 Stream 對應的集合,而後對每一個元素執行全部的函數

並行parallelStream

咱們看這個代碼,輸出不是順序的

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9);
        numbers.parallelStream()
                .forEach(out::println);複製代碼

底層使用ForkJoinPool,相比於ThreadPoolExecutor,可讓線程建立新的任務,並掛起當前任務,此時線程能夠在隊列中選擇子任務執行

相關文章
相關標籤/搜索