Lambda表達式

1.Date可變,設計的很差,如setYear可改變其年,很差用
   jdk1.8:用LocalDate和LocalDateTime代替Date   
LocalDate localDate=LocalDate.now();
localDate.plusDays(1);
2.特色:
    a.函數式編程
    b.參數類型自動推斷(可不指定參數類型)
    c.代碼量少,簡潔
3.好處:
    1.更簡潔的代碼
    2.更容易的並行
4.如何學:
    1.熟悉泛型,多用Stream Api
5.使用場景:
    1.任何有函數式(只有一個抽象方法的接口, Object的方法和default、static修飾的方法除外)接口的地方; @FunctionalInterface可加在函數式接口上
         
6.常見函數式接口:
    1.Supplier一個輸出,獲取結果;Function表明一個輸入和一個輸出(輸入和輸出通常不一樣類型);UnaryOpeartory:一個輸入和輸出(二者同類型)
      
    2.Consumer表明一個輸入;BiConsumer表明兩個輸入;BiFunction兩輸入,一輸出(不一樣類型);BinaryOpearator兩輸入,一輸出(同類型)
     
     
    小結(基礎):
         
    3.lambada語法:
      a.lambda表達式是對象(一個函數式接口的實例)
         
         
         
4.lambda:參數可省略(但要麼全省或全不省);參數不能用final修飾;不能把lambda轉給Object(非作的話,先轉爲函數式接口);
   不須要也不容許使用throws語句來聲明它可能會拋出的異常
5.方法的引用:   直接訪問類或者實例的已經存在的方法或者構造方法,提供了一種引用而不執行方法的方式,若是抽象方法的實現剛好
可使用調用另一個方法來實現,就有可能使用方法引用。
1.抽象方法沒有輸入參數,不能使用對象方法引用
構造方法引用:
Runnable r = () -> {};//無參無返回值
//有參無返回值
Consumer<String> c2 = (a) -> {};
Consumer<String> c3 = a -> {};
Consumer<String> c4 = (String a) -> {System.out.println(a);};
c4.accept("1");
//無參有返回值
Supplier<String> s1 = () -> "hello";
Supplier<String> s2 = () -> {return "hello";};
//有參有返回值
Function<String,Integer> f1=(str)->Integer.valueOf(str);
Function<String,Integer> f2=(String str)->Integer.valueOf(str);
Function<String,Integer> f3=(String str)->{return Integer.valueOf(str);};
System.out.println(f3.apply("2"));
6.Stream Api:處理數組和流的api
  Stream特色: a.不是數據結構,沒有內部存儲
    b.不支持索引訪問,延遲計算
    c.支持並行,容易生成數組或集合(List、Set)
    d.支持過濾、查找、轉換、彙總、聚合等操做
Stream運行機制:源Source  中間操做  終止操做
流的源能夠是一個數組、集合、生成器方法、I/O通道等;一個流能夠有零個或多箇中間操做,
每個中間操做都會返回一個新的流,供下一個操做用;一個流只會有一個終止操做
Stream只有遇到終止操做,其源纔開始執行遍歷操做。
中間操做:過濾 filter
    去重 distinct   排序 sorted   截取 limit skip(忽略前多少個)
    轉換 map/flatMap    其餘peek(經常使用語輸出信息)
終止操做:
  循環 forEach  計算:min、max、count、average
  匹配:anyMatch、allMatch、noneMatch、findFirst、findAny
  匯聚:reduce   收集器:toArray collect
Stream的建立:
   1.經過數組 Stream.of(arr)  2.經過集合   3.經過Stream.generate方法來建立
   4.經過Stream.iterate方法    5.其餘Api來建立String a="aaa";IntStream intStream=a.chars();
Stream<Integer> stream=Stream.iterate(1,x->x+1);
stream.limit(10).forEach(System.out::println);
Stream<Integer> stream=Stream.generate(()->1);
stream.limit(10).forEach(System.out::println);
List<Integer> list = Stream.iterate(1, x -> x + 1).limit(50).filter(x -> x % 2 == 0).collect(Collectors.toList());//蒐集50前的偶數爲一個list
String s="11,22,33";
List<Integer> list = Stream.of(s.split(",")).map(Integer::valueOf).collect(Collectors.toList());//蒐集成list
System.setProperty("java.util.concurrent.ForkJoinPool.common.parallelism","6");//設置併發線程數6
Optional<Integer> result = Stream.iterate(1, x -> x + 1).limit(200).parallel().peek(x -> {
System.out.println(Thread.currentThread().getName());//並行計算    
}).max(Integer::compare);
sequential()//串行計算
String indexStr = "itemId=1&userId=2&type=2&token=3333&key=index";   //拆分轉換成map
Map<String, String> param = Stream.of(indexStr.split("&")).map(s -> s.split("=")).collect(Collectors.toMap(s -> s[0], s -> s[1]));
Collectors.joining(",","(",")");//(1,2) 形式輸出
分組統計:






























































相關文章
相關標籤/搜索