java8 lambda 表示式的運用
阿新 • • 發佈:2018-12-16
函式式介面:
- 如果一個介面只有一個抽象方法,那麼該介面就是一個函式式介面
- 如果我們在某個介面上申明瞭FunctionalInterface 註解,那麼編譯器就會按照函式式介面的定義來要求該介面
- 如果某個介面只有一個抽象方法,但我們並沒有給該介面申明FunctionalInterface 註解,那麼編譯器依舊會將該介面看作是函式式介面
- 如果一個介面中抽象方法是重寫了object的公有方法,那麼此方法不給抽象方法加一,什麼意思呢?比如,我們寫了一個介面,但是接口裡面有兩個抽象方法,一個是 void add(),一個是 String toString();由於java.lang.Object裡面是有toString()方法的,所以這個介面還是符合函式式介面的,即只有一個抽象方法,雖然我們在介面中定義了兩個抽象方法。
Lambda 表示式是基於函式式介面的。
Lambda 表示式的基本語法:()-> { } 或者(a,b)->{} ,總共分為三部分,即()、-> 、{} ;
其中小括號代表函式式介面的引數,沒有可以留空括號,花括號代表介面的實現方法體。
public class mianshi { @FunctionalInterface public interface addTest { //自定義了一個函式式介面 Integer sd(Integer a, Integer b); } public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int a1 = scanner.nextInt(); int b1 = scanner.nextInt(); addTest addTest1 = (a, b) -> { //使用lambda表示式實現 if (a > b) { return a + b; } else { return a - b; } }; System.out.println(addTest1.sd(a1, b1)); } }
public static void main(String[] args) { List<Integer> arrayList = Arrays.asList(1, 2, 3, 4, 5, 6); arrayList.forEach(new Consumer<Integer>{ @Override public void accept(Integer integer){ System.out.println(integer); } }); arrayList.forEach(i -> System.out.println(i)); //由於Consumer是一個函式式介面,可用lambda表示式 new Thread(new Runnable() { @Override public void run() { System.out.println("Hello eaphy1 !"); } }).start(); new Thread(() -> System.out.println("Hello eaphy2 !")).start(); //由於Runnable是一個函式式介面,可用lambda表示式 }