1. 程式人生 > >java8 lambda 表示式的運用

java8 lambda 表示式的運用

函式式介面:

  • 如果一個介面只有一個抽象方法,那麼該介面就是一個函式式介面
  • 如果我們在某個介面上申明瞭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表示式

    }