posts - 22, comments - 32, trackbacks - 0, articles - 73
            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理
          函數(shù)式接口的特征

          1、三種方法

          • 唯一的抽象方法
          • 使用default定義普通方法(默認(rèn)方法),通過對(duì)象調(diào)用。
          • 使用static定義靜態(tài)方法,通過接口名調(diào)用。

          2、一個(gè)新注解@FunctionInterface

          • 注解@FunctionalInterface告訴編譯器這是一個(gè)函數(shù)式接口,明確這個(gè)函數(shù)中只有一個(gè)抽象方法,當(dāng)你嘗試在接口中編寫多個(gè)抽象方法的時(shí)候編譯器將不允許,但是可以有多個(gè)非抽象方法。

          • 不過Object類的方法可以定義為抽象方法,因?yàn)榻涌诘膶?shí)現(xiàn)類一定是Object的子類

          • 如果接口被標(biāo)注了@FunctionalInterface,這個(gè)類就必須符合函數(shù)式接口的規(guī)范

          • 即使一個(gè)接口沒有標(biāo)注@FunctionalInterface,如果這個(gè)接口滿足函數(shù)式接口規(guī)則,依舊被當(dāng)作函數(shù)式接口。

          3JDK 1.8 新增加的函數(shù)接口包
             

              java.util.function.*
              java.util.function 它包含了很多接口,用來支持 Java的 函數(shù)式編程,它們大致分為五類:

              
             

           4、代碼樣例

              
              /**
               *JDK 8 函數(shù)式接口  Supplier、Function、Consumer、Predicate
               *
               * @param args
               * @throws Exception
               
          */

              public static void main(String[] args) throws Exception {
                  ThreadPoolExecutor executor = (ThreadPoolExecutor)newFixedThreadPool(10);
                  //1:JDK8以前,通過匿名內(nèi)部類實(shí)現(xiàn)函數(shù)式接口
                  executor.submit(new Runnable() {
                      @Override
                      public void run() {
                          System.out.println("JDK8以前,通過匿名內(nèi)部類實(shí)現(xiàn)函數(shù)式接口");
                      }
                  });
                  //2:JDK8以后可以使用lambda 表達(dá)式來實(shí)現(xiàn),lambda表達(dá)式就是為了優(yōu)化匿名內(nèi)部類而生(分開寫效果)
                  Thread thread = new Thread(() -> System.out.println("task running !"));
                  Runnable r = () -> System.out.println("JDK8以后可以使用lambda 表達(dá)式來實(shí)現(xiàn),lambda表達(dá)式就是為了優(yōu)化匿名內(nèi)部類而生(分開寫效果)!");
                  executor.submit(r);
                  //3:合并起來效果
                  executor.submit(() -> {
                      System.out.println("JDK8以后可以使用lambda 表達(dá)式來實(shí)現(xiàn),lambda表達(dá)式就是為了優(yōu)化匿名內(nèi)部類而生!");
                  });

                  //4:其它 Supplier、Function、Consumer、Predicate 都可以用lambda 表達(dá)式來實(shí)現(xiàn)
                  Supplier<String> supplier = () -> "我是SuSupplier";
                  Supplier<Integer> supplier2 = () -> new Integer(1);
                  System.out.println("supplier=" + supplier.get() + ";supplier2=" + supplier2.get());

                  //5: Function功能型函數(shù)式接口 Function<T, R> 接受一個(gè)輸入?yún)?shù)T,返回一個(gè)結(jié)果R
                  Function<String,Integer> function=str -> Integer.parseInt(str);
                  Function<Integer,String> fun2 = item -> item+"";
                  System.out.println("輸入字符型 1 返回int型結(jié)果:"+function.apply("1"));
                  System.out.println("輸入整型 1 返回字符型結(jié)果:"+fun2.apply(2));

                  //6: Consumer 一個(gè)接受單個(gè)輸入?yún)?shù)并且不返回結(jié)果的操作。 與大多數(shù)其他函數(shù)接口不同, Consumer接口期望通過接受參數(shù),改普通對(duì)象引用值(說明白點(diǎn)就是對(duì)原來的值進(jìn)行加工,注意返回值 void)
                  Consumer<StringBuffer> consumer= sb->sb.append("-yyy");
                  StringBuffer sb1=new StringBuffer().append("111");
                  consumer.accept(sb1);
                  //改變sb的內(nèi)部引用值
                  System.out.println("=========s="+sb1.toString());

                  //7: Predicate<T> 斷言型接口常用于集合的過濾,得到一個(gè)新的集合 Stream filter(Predicate<? super T> predicate);
                  Predicate<Integer> predicate = age -> age > 18;
                  Predicate<String> predicate2 = str -> str != null;
                  System.out.println(predicate.test(19));
                  System.out.println(predicate2.test(null));
                  //我們常用集合過濾類就是對(duì)這個(gè)接口實(shí)現(xiàn)類 其中 filter(Predicate<? super T> predicate) 用的就是這個(gè)接口
                  List<String> list= Lists.newArrayList("1","2","2","3","4","4","8");
                  list.stream().map(s -> Long.parseLong(s)).distinct().filter(s -> s < 10).collect(Collectors.toList()).forEach(-> System.out.println(u));

                  //總結(jié),以上的例子其實(shí)都是JDK8 lambda 表達(dá)式簡潔的寫法,而且全是合并寫的,并沒有分開步驟寫(所有函數(shù)性接口,都可以用lambda 表達(dá)式簡潔寫法)

                  
          //關(guān)閉線程池
                  executor.shutdownNow();
              }
          主站蜘蛛池模板: 资兴市| 张掖市| 扎鲁特旗| 泸西县| 南乐县| 柞水县| 嘉定区| 秭归县| 麦盖提县| 鄂托克前旗| 黄陵县| 大兴区| 巨鹿县| 陈巴尔虎旗| 金华市| 湖南省| 娄底市| 徐州市| 新巴尔虎右旗| 湘潭县| 哈尔滨市| 天气| 涟源市| 漠河县| 临沧市| 柘荣县| 临夏县| 鄂州市| 怀来县| 兰州市| 卢湾区| 永顺县| 甘德县| 上犹县| 博湖县| 成安县| 鄂尔多斯市| 新蔡县| 墨竹工卡县| 石景山区| 正阳县|