Java8開始支持函數式編程、包括lambda表達式、Stream流。java
函數式編程用於簡化開發,對於某些類,或許只使用一次,那麼就不必對其進行單獨的實現一個類,java本來提供了簡化的方案,如內部類、匿名內部類等。編程
lambda對此更加簡化。app
函數式接口就是隻有一個方法的接口,想一想函數是否是一個個是獨立的。jvm
Runnable接口就是一個函數式接口,以下:函數式編程
@FunctionalInterface public interface Runnable { public abstract void run(); } //@FunctionalInterface註解表明這是一個函數式接口,但不是必須的,加上註解jvm會幫助檢查。 // public abstract void run();中的abstract也能夠省略,接口中的方法本就是抽象方法
使用了函數式接口後,就不須要實現類,直接使用lambda便可。函數
lambda用於替代實現類,形式以下:spa
FunctionalInterface func=()->{ ...... };
@FunctionalInterface interface Func{ void hello(); }
public class LambdaDemo { public static void main(String[] args) { Func func=()->{ System.out.println("hello");//lambda表達式 }; func.hello();//調用方法 } }
直接在抽象方法前加上返回類型,在lambda中有返回值便可。code
public class LambdaDemo { public static void main(String[] args) { Func func=()->{ System.out.println("hello"); return "ok lambda"; }; String s = func.hello(); System.out.println(s); } } @FunctionalInterface interface Func{ String hello(); }
參數聲明在抽象方法中,在lambda中加上類型便可:接口
public class LambdaDemo { public static void main(String[] args) { Func func=(int a,String c)->{ System.out.println("hello"+a+c); return "ok lambda"; }; String s = func.hello(8,"yes"); System.out.println(s); } }
lambda中的數據類型能夠略去開發
Func func=( a,c)->{ System.out.println("hello"+a+c); return "ok lambda"; };
若是隻有一個參數的話,連()均可以省略。
public class LambdaDemo { public static void main(String[] args) { Func func=c->{ //lambda省去() System.out.println("hello "+c); return "ok lambda"; }; String s = func.hello("yes"); System.out.println(s); } } @FunctionalInterface interface Func{ String hello(String b); }
JDK 1.8爲咱們預約義了許多函數式接口,它們位於java.util.function包中。
經常使用的以下:
序號 | 接口名 | 抽象方法 | 說明 |
---|---|---|---|
1 | Supplier<T> | Tget() | 無輸入參數,經過一系列操做產生一個結果返回 |
2 | Consumer<T> | voidaccept(Tt) | 一個輸入參數,針對參數作一系列操做,無返回值 |
3 | Function<T,R> | Rapply(Tt) | 一個參數,一個返回值,針對參數生成一個返回值 |