java新特性_day03

本文详细介绍了Java中Lambda表达式和方法引用的相关知识。阐述了Lambda表达式的语法规则,如形参列表、返回值等情况的处理。还介绍了方法引用,包括引用实例方法、类方法、类的实例方法以及构造器的引用,并给出了相应的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/**
 * Lambda语法:
 * Lambda表达式可以认为是一种特殊的匿名内部类
 *  ([形参列表,不带数据结构]) ->{
 *  //执行语句
 *  [return ...;]
 *  };
 *  
 *  1.如果形参列表是空的,只需要保留()即可
 *  2.如果没有返回值,只需要在{}里面写执行语句即可
 *  3.如果接口的抽象方法只有一个形参,可以省略(),只需要参数的名称即可
 *  4.如果执行语句只有一行,可以省略{}
 *  5.形参列表的数据类型自动推断,只要参数名称
 *  6.如果函数式借口的方法有返回值,必须给定返回值,如果执行语句只有一行代码,
 *  可以省略大括号,但必须同时省略return
 *  7.和匿名内部类一样,如果访问局部变量,要求局部变量必须是final的
 * @author User
 * 
 * 方法的引用:
 *     引用实例方法
 *         自动把调用方法的时候的参数,全部传给引用的方法
 *          函数式接口 变量名 = 实例 :: 方法名
 *         //自动把实参全部传给引用的实例方法
 *         <变量名>.<接口方法名>([实参]);
 *     引用类方法
 *         全部参数传给引用的方法
 *          函数式接口 变量名 = 类名 :: 方法名
 *        //自动把实参传递给引用的方法
 *         <变量名>.<接口方法名>([实参]);
 * 
 *     引用类的实例方法
 *         定义,调用接口的方法的时候,需要多一个参数,并且参数的类型和引用实例
 * 方法的类型必须一致。
 *         把第一个参数作为用的实例,后面的每个参数全部传递给引用的方法。
 *         interface 函数式接口{
 *        <返回值> 方法名(类名 名称,其他类型参数 参数名); 
 *         }
 * 
 *         函数式接口 变量名 = 类名::实例方法;
 *         变量名.方法名(类实例,其他参数)
 * 
 * 构造器的引用
 *         把方法的所有参数全部传递给用用的构造器,根据参数的类型推断调用的构造器
 *         类名::new
 *
 */

package day02;

/**
 * 为什么要只有Lambda只能用于函数式接口:
 * 因为lambda没有指明实现那个方法,所以只能实现一个方法
 * 
 * @author User
 *
 */

public class Test {
    public static void main(String[] args) {
        // 引用类方法
        TestClassMethod t = output :: outputTest;
        t.test("a", 1);
        
        
        System.out.println("========");
        TestClassMethod t1 = (x,y) -> {
            System.out.println("Lambda"+x);
            System.out.println("Lambda"+y);
        };
        
        t1.test("a", 2);
        
        // 实例方法的引用:
        TestClassMethod2 test2 = System.out :: println;
        test2.test1("a");
        
        //普通的lambda表达式
        TestClassMethod3 test3 = () -> {
            return new User();
        };
        User u = test3.getUser();
        System.out.println(u);
        
        
        //构造器引用
        TestClassMethod3 test4 = User :: new ;
        User user4 = test4.getUser();
        System.out.println(user4);
        
        
        //匿名内部类
        TestClassMethod3 test5 = new TestClassMethod3(){
            public User getUser(){
                System.out.println("User方法");
                return new User();
            }
            
        };
        
        System.out.println(test5);
        
        System.out.println("=========");
        TestClassMethod4 test6 = TestClassMethod3 :: getUser;
        //把函数式接口的第一个参数,作为类的一个实例
        User user6 = test6.getUser(test5);
        System.out.println(user6);
    }
    
}
 

 

package day02;

public interface TestClassMethod {
    void test(String str,int i);

}
 

package day02;

@FunctionalInterface
public interface TestClassMethod2 {
    void test1(String str);

}

 

package day02;

public interface TestClassMethod3 {
    User getUser();

}
 

package day02;

@FunctionalInterface
public interface TestClassMethod4 {
    User getUser(TestClassMethod3 testUser);

}
 

package day02;

public class User {
    public User(){
        System.out.println("User的构造器");
    }

}

 

package day02;

public class output {
    public static void outputTest(String a,int b){
        System.out.println("类方法"+a+":"+b);
    }

}
 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值