java进阶打卡39

方法引用

双冒号::为引用运算符,而它所在的表达式被称为【方法引用】。如果Lambda要表达的函数方案已经存在于某个方法的实现中,那么则可以通过双冒号来引用该方法作为Lambda的替代者。

第一种语义是指:拿到参数之后经Lambda之手,继而传递给System.out.println方法去处理。
第二种等效写法的语义是指:直接让System.out中的println方法来取代Lambda。两种写法的执行效果完全一样,而第二种方法引用的写法复用了已有方案,更加简洁。

注:Lambda中传递的参数一定是方法引用中的那个方法可以接收的类型,否则会抛出异常。

// 定义一个打印的函数式接口
@FunctionalInterface
public interface Printable {
    // 打印字符串的抽象方法
    void print(String s);
}

public class Demo01Printable {
	// 定义一个方法,参数传递Printable接口,对字符串进行打印
	public static void printString(Printable p){
		p.print("HelloWorld");
	}
	
	public static void main(String[] args) {
		// 调用printString方法,方法的参数Printable是一个函数式接口,所以可以传递Lambda
	    printString((s)->{
	    	System.out.println(s);
	    });
	
	 
		/*分析:
			Lambda表达式的目的,打印参数传递的字符串
	        把参数s,传递给了System.out对象,调用out对象中的方法println对字符串进行了输出
	        注意:
	        	1. System.out对象是已经存在的
	        	2. println方法也是已经存在的
	        所以我们可以使用方法引用来优化Lambda表达式
	        可以使用System.out方法直接引用(调用)println方法*/
	                 
		printString(System.out::println);
	}
}

通过对象名引用成员方法

通过对象名引用成员方法:使用前提是对象名是已经存在的,成员方法也是已经存在的,就可以使用对象名来引用成员方法。

// 定义一个打印的函数式接口
@FunctionalInterface
public interface Printable {
    // 打印字符串的抽象方法
    void print(String s);
}

public class MethodRerObject {
    // 定义一个成员方法,传递字符串,把字符串按照大写输出
    public void printUpperCaseString(String str){
        System.out.println(str.toUpperCase());
    }
}

public class Demo01ObjectMethodReference {
	// 定义一个方法,方法的参数传递Printable接口
	public static void printString(Printable p){
		p.print("Hello");
	}
	
	public static void main(String[] args) {
		// 调用printString方法,方法的参数Printable是一个函数式接口,所以可以传递Lambda表达式
		printString((s)->{
	    	// 创建MethodRerObject对象
	        MethodRerObject obj = new MethodRerObject();
	        // 调用MethodRerObject对象中的成员方法printUpperCaseString,把字符串按照大写输出
	        obj.printUpperCaseString(s);
		});
	
	    /*使用方法引用优化Lambda
	    对象是已经存在的MethodRerObject
	    成员方法也是已经存在的printUpperCaseString
	    所以我们可以使用对象名引用成员方法*/    
	         
		// 创建MethodRerObject对象
	    MethodRerObject obj = new MethodRerObject();
	    printString(obj::printUpperCaseString);
	}
}

通过类名引用静态成员方法

通过类名引用静态成员方法:类已经存在,静态成员方法也已经存在,就可以通过类名直接引用静态成员方法。

@FunctionalInterface
public interface Calcable {
    // 定义一个抽象方法,传递一个整数,对整数进行绝对值计算并返回
    int calsAbs(int number);
}

public class Demo01StaticMethodReference {
	// 定义一个方法,方法的参数传递要计算绝对值的整数,和函数式接口Calcable
	public static int method(int number,Calcable c){
		return c.calsAbs(number);
	}
	
	public static void main(String[] args){
		// 调用method方法,传递计算绝对值的整数,和Lambda表达式
	    int number = method(-10,(n)->{
	    	// 对参数进行绝对值的计算并返回结果
	        return Math.abs(n);
		});
		System.out.println(number);
	        
		/*使用方法引用优化Lambda表达式
	    Math类是存在的
	    abs计算绝对值的静态方法也是已经存在的
	    所以我们可以直接通过类名引用静态方法*/
	         
	    int number2 = method(-10,Math::abs);
	    System.out.println(number2);
	}
}

通过super引用父类的成员方法

// 定义见面的函数式接口
@FunctionalInterface
public interface Greetable {
    // 定义一个见面的方法
    void greet();
}

// 定义父类
public class Human {
    // 定义一个sayHello的方法
    public void sayHello(){
        System.out.println("Hello 我是Human!");
    }
}

// 定义子类
public class Man extends Human{
    // 子类重写父类sayHello的方法
    @Override
    public void sayHello() {
        System.out.println("Hello 我是Man!");
    }

    // 定义一个方法参数传递Greetable接口
    public void method(Greetable g){
        g.greet();
    }

    public void show(){
        // 调用method方法,方法的参数Greetable是一个函数式接口,所以可以传递Lambda
        /*method(()->{
            // 创建父类Human对象
            Human h = new Human();
            // 调用父类的sayHello方法
            h.sayHello();
        });*/

        // 因为有子父类关系,所以存在一个关键字super,代表父类,所以我们可以直接使用super调用父类的成员方法
        /*method(()->{
            super.sayHello();
        });*/
        
        /*使用super引用父类的成员方法
        super是已经存在的
        父类的成员方法sayHello也是已经存在的
        所以我们可以直接使用super引用父类的成员方法*/
         
        method(super::sayHello);
    }

    public static void main(String[] args) {
        new Man().show();
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java员工打卡签到代码的实现方式有很多种,以下是其中一种可能的实现方式: ```java import java.util.Date; public class Employee { private String name; private Date lastSignIn; public Employee(String name) { this.name = name; } public void signIn() { Date now = new Date(); System.out.println(name + "签到成功,时间:" + now); lastSignIn = now; } public void signOut() { Date now = new Date(); System.out.println(name + "签退成功,时间:" + now); } public void checkInStatus() { if (lastSignIn == null) { System.out.println(name + "尚未签到"); } else { System.out.println(name + "上次签到时间:" + lastSignIn); } } } ``` 上面的代码定义了一个`Employee`类,其中包含了员工的姓名和上次签到时间。类中有三个方法:`signIn()`、`signOut()`和`checkInStatus()`。`signIn()`方法表示员工签到,会打印出员工姓名和当前时间,并将当前时间记录为上次签到时间;`signOut()`方法表示员工签退,会打印出员工姓名和当前时间;`checkInStatus()`方法表示查询员工的签到状态,会打印出员工姓名和上次签到时间(如果已经签到过),否则会提示尚未签到。 如果要使用这段代码,可以在其他类中创建`Employee`对象,并调用其中的方法来完成打卡签到功能。例如: ```java public class Main { public static void main(String[] args) { Employee emp1 = new Employee("张三"); emp1.signIn(); emp1.checkInStatus(); emp1.signOut(); } } ``` 这段代码创建了一个名为`emp1`的`Employee`对象,姓名为“张三”。接着调用了`signIn()`方法进行签到,`checkInStatus()`方法查询签到状态,最后调用了`signOut()`方法进行签退。运行这段代码后,会打印出以下结果: ``` 张三签到成功,时间:Thu Jul 22 14:47:23 CST 2021 张三上次签到时间:Thu Jul 22 14:47:23 CST 2021 张三签退成功,时间:Thu Jul 22 14:47:28 CST 2021 ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值