java学习笔记-lambda表达式

java学习笔记-lambda表达式

1.标准格式

形式参数+ 箭头+ 代码块

格式:{形式参数}->{代码块}

形式参数:如果有多个参数,参数之间用逗号隔开;如果没有参数,留空即可

-> 由英文中画线和大于符号组成,固定写法。代表指向动作
代码块:具体内容

lambda表达式使用前提:有一个接口,接口中有且仅有一个抽象方法

	package com.ustc.test6;
	
	public class TestLambda {
    
    
	
	    public static void main(String[] args) {
    
    
	
	        useShowHandler(new ShowHandler() {
    
    
	            @Override
	            public void show() {
    
    
	                System.out.println("我是匿名内部类的show方法");
	            }
	        });
	
	
	        //lambda表达式实现   没有参数   接口中只有一个方法  
	        useShowHandler(()->{
    
    
	            System.out.println("我是lambda中的show方法");
	        });
	
	    }
	
	    public static void useShowHandler(ShowHandler showHandler){
    
    
	        showHandler.show();
	    }
	}
	
	interface  ShowHandler{
    
    
	    void show();
	}

2.无参数有返回值

	package com.ustc.test7;
	
	import java.util.Random;
	
	public class RandomNumHandlerDemo {
    
    
	
	    public static void main(String[] args) {
    
    
	        
	        useRandomHandler(new RandomNumHandler() {
    
    
	            @Override
	            public int getNumber() {
    
    
	                Random r = new Random();
	                int num = r.nextInt(10) + 1;               
	                return num;
	            }
	        });
	        
	        
	        //lambda表达式 有返回值 
	        useRandomHandler(()->{
    
    
	            
	            Random r = new Random();
	            int num = r.nextInt(10) + 1;
	            return num;
	            
	        });
	        
	    }
	    
	    
	    public static void useRandomHandler(RandomNumHandler randomNumHandler)
	    {
    
    
	        int result = randomNumHandler.getNumber();
	        System.out.println(result);
	    }
	    
	}
	
	
	interface RandomNumHandler{
    
    
	    int getNumber();
	}

3.有参数有返回值

package com.ustc.test7;

public class Tes {
    
    

    public static void main(String[] args) {
    
    

        useCal(new cal() {
    
    
            @Override
            public int calc(int a, int b) {
    
    
                return a + b;
            }
        });
        useCal((int a,int b)->{
    
    return a + b;});

    }

    public static void useCal(cal c){
    
    
        int result = c.calc(1,2);
        System.out.println(result);

    }
}


interface cal{
    
    
    int calc(int a,int b);
}

4.lambda表达式与匿名内部类之间的区别

1. 所需类型不同
匿名内部类:可以是接口 也可以是抽象类  还可以是具体类
lambda表达式:只能是接口

2. 使用限制不同
如果接口中有且仅有一个抽象方法  可以使用 lambda表达式  也可以使用 匿名内部类  
如果接口中有多于一个抽象方法   只能使用匿名内部类   而不能使用lambda表达式

3. 实现原理不同
匿名内部类:编译之后产生一个单独的.class字节码文件
lambda表达式:编译之后     没有一个单独的.class字节码文件    对应的字节码文件  会在运行的时候 动态生成

Guess you like

Origin blog.csdn.net/qq_44653420/article/details/121374241