JDk8學習

code見:https://gitee.com/_lzd/java-pracitce/tree/master/src/main/java/jdk8

java

函數式接口 (@FunctionalInterface註解)

特色:

一、只能有一個抽象方法

二、能夠有多個默認方法

三、能夠有多個static方法

四、抽象方法能夠經過lambda表達式實現


git

lambda 語法

1、Lambda 表達式的基礎語法:Java8中引入了一個新的操做符 "->" 該操做符稱爲箭頭操做符或 Lambda 操做符 箭頭操做符將 Lambda 表達式拆分紅兩部分:

左側:Lambda 表達式的參數列表
右側:Lambda 表達式中所需執行的功能, 即 Lambda 體

語法格式一:無參數,無返回值
     () -> System.out.println("Hello Lambda!");

語法格式二:有一個參數,而且無返回值
     (x) -> System.out.println(x)

語法格式三:若只有一個參數,小括號能夠省略不寫
     x -> System.out.println(x)

語法格式四:有兩個以上的參數,有返回值,而且 Lambda 體中有多條語句
     Comparator<Integer> com = (x, y) -> {
         System.out.println("函數式接口");
         return Integer.compare(x, y);
     };

語法格式五:若 Lambda 體中只有一條語句, return 和 大括號均可以省略不寫
     Comparator<Integer> com = (x, y) -> Integer.compare(x, y);

語法格式六:Lambda 表達式的參數列表的數據類型能夠省略不寫,由於JVM編譯器經過上下文推斷出,數據類型,即「類型推斷」
     (Integer x, Integer y) -> Integer.compare(x, y);

上聯:左右遇一括號省
下聯:左側推斷類型省
橫批:能省則省

2、Lambda 表達式須要「函數式接口」的支持
函數式接口:接口中只有一個抽象方法的接口,稱爲函數式接口。 可使用註解 @FunctionalInterface 修飾
          能夠檢查是不是函數式接口


lambda表達式實現接口的幾種方式

接口 IDemo  函數show(String str)

一、傳統方式
Class Demo implements Idemo{

    show(String str){
        //邏輯
    }
}

Demo demo = new Demo();
demo.show("123");

二、lambda方式(接口做爲參數傳遞,在調用的時候再實現具體的邏輯)
class Demo{
    void show(IDemo demo){
        String str = "123";
        demo.show(str)
    }
}

Demo demo = new Demo();
demo.show((str) ->{
    //對字符串str的處理邏輯
});


四大核心函數式接口

  • 消費型
Consumer<T>
   void accept(T var1);
  • 供給型
Supplier<T>
   T get();
  • 斷言型
Predicate<T>
   boolean test(T t);
  • 函數型
Function<T, R>
   R apply(T var1);


方法/構造/數組引用

方法引用:若lambda體中的內容有方法已經實現了,咱們可使用方法引用(能夠理解爲方法引用是lambda的另外一種表現形式)
數組

  • 三種格式:
    • 對象::實例方法名
    • 類::靜態方法名
    • 類::實力方法名

2、構造引用(注意:須要調用的構造器參數列表要與函數式接口中抽象方法的參數列表保持一致。)app

  • 格式:
    • ClassName::new

三:數組引用dom

  • 格式:
    • Type[]::new


Stream


stream的三個流程

1、建立

2、中間操做(執行不會有結果,必選加終結操做)

3、終止操做
ide

  • 建立
//1、collection 系列集合提供stream() 和 parallelStream()
         List<String> list = new ArrayList<>();
         Stream<String> stream1 = list.stream();
 
         //2、Arrays中的靜態方法
         String[] arr = new String[10];
         Stream<String> stream2 = Arrays.stream(arr);
 
         //3、經過stream中的靜態方法of
         Stream<Integer> stream3 = Stream.of(1, 23, 45);
 
         //四 建立無限流遞增
         Stream<Integer> stream4 = Stream.iterate(0, (x) -> x + 2);
         //五 生成無線流
         Stream.generate(() -> Math.random());


  • 中間操做
* 中間操做(執行不會有結果,必選加終結操做)
     * 
     * 篩選與切片
     * filter
     * limit
     * skip-經過前n個元素,若流中元素不足n時則返回一個空流
     * distinct-篩選經過流生成元素的hashcode和requals去重複元素
     * 
     * 映射
     * map:接受一個函數,該函數會被映射到每一個元素上,並將其映射成一個新的元素
     * flatmap:接受一個函數做爲參數,將流中的每一個值都換成另外一個流,而後把全部流鏈接成一個流。相似list.add 和 list.addAll的概念
     *
     * 排序
     * sorted()——天然排序
     * sorted(Comparator com)——定製排序


  • 終結操做
* allMatch——檢查是否匹配全部元素
     * anyMatch——檢查是否至少匹配一個元素
     * noneMatch——檢查是否沒有匹配的元素
     * findFirst——返回第一個元素
     * findAny——返回當前流中的任意元素
     * count——返回流中元素的總個數
     * max——返回流中最大值
     * min——返回流中最小值
     * 歸約 reduce(T identity, BinaryOperator) / reduce(BinaryOperator) ——能夠將流中元素反覆結合起來,獲得一個值。(例如計算求和)
     * collect——將流轉換爲其餘形式。接收一個 Collector接口的實現,用於給Stream中元素作彙總的方法(例如:集合轉set\map\分組\分區等)
相關文章
相關標籤/搜索