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表达式

    }

猜你喜欢

转载自blog.csdn.net/eaphyy/article/details/84454385