方法的引用

概念

public class demo01Printable {

public static void main(String[] args) {
   printString((s)->{ System.out.println(s); });//lambda表达式
/*
    分析:lambda表达式目的:打印参数传递的字符串
    1、System.out对象已经存在
    2、println方法也是已经存在的
    可以优化lambda表达式
 */
    printString(System.out::println);//方法引用写法 双冒号::
}
//定义一个方法 参数传递Prinable接口,对字符串进行打印
public static void printString(Printable p){
    p.print("HelloWorld");

}
}

通过对象名引用成员方法

/*
通过对象名引用成员方法
使用前提 对象名已经存在,成员方法已经存在

*/

public class demo01ObjectMethodReference {
//定义一个方法,方法的参数传递Printable接口
public static void printString(Printable1 p){
    p.print("HelloWorld");
}

public static void main(String[] args) {
    //调用printString方法,方法的参数是一个函数式接口 可以使用lambda表达式
    printString((s)->{
        //创建MethodRerObject对象
        demoMethodRerObject obj  =new demoMethodRerObject();
        //调用MethodRerObject对象的成员方法printUpperCaseString,把字符串按照大写输出
        obj.printUpperCaseString(s);
    });

    /*
       使用方法引用优化lambad表达式
       对象是已经存在的MethodRerObject
       成员方法已经存在的printUpperCaseString
       可以使用对象名引用成员方法
     */
    demoMethodRerObject obj2 =new demoMethodRerObject(); //创建MethodRerObject对象
    printString(obj2::printUpperCaseString);
    }
}
/*
定义一个打印的函数式接口
*/
@FunctionalInterface	
public interface Printable1 {
void print(String s);
}

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

类名引用静态成员方法

/*
通过类名引用静态成员方法
类已经存在 静态成员方法已经存在
*/

public class demoStaticMethodReference {
//定义一个方法 方法参数传递计算绝对值的整数 函数式接口Calcable
public static int method(int number,Calcable c){
    return c.calsAbs(number);
}

public static void main(String[] args) {
    //调用method方法,传递绝对值
    int method = method(-10, (n) -> {
        //对参数进行绝对值计算并返回结果
        return Math.abs(n);
    });
    System.out.println(method);
    /*
        使用方法引用优化lambda表达式
     */
    int method1 = method(-20, Math::abs);
    System.out.println(method1);


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

super引用

/*
定义一个子类
*/

public class Man extends Human{
//重写

@Override
public void sayHello() {
    System.out.println("Hello,i am Man");
}
//定义一个方法参数传递Greetable接口
public void method(Greetable g){
    g.greet();
}
public void show(){
    //调用method方法 方法参数Greetable是一个函数式接口 可以传递lambda
    method(()->{
        Human h =new Human();
        h.sayHello();
    });
    /*
        使用super直接调用父类的成员方法
     */
    method(()->{
       super.sayHello();
    });
    /*
        使用super引用父类成员方法
     */
    method(super::sayHello);
}

public static void main(String[] args) {
    new Man().show();
}
}
/*
定义父类
 */

public class Human {
//
public void sayHello(){
    System.out.println("Hello,我是Human");
}
}
/*
定义见面的函数式接口
 */
@FunctionalInterface
public interface Greetable {
void greet();
}

this引用

/*
通过this引用本类的成员方法
*/

public class Husband {
//定义一个买房子的方法
public void buyHouse(){
    System.out.println("买房子咯");
}
//定义一个结婚方法
public void marry(Richable r){
    r.buy();
}
//定义一个开心方法
public void Happy(){
    //调用结婚方法 方法参数是函数式接口 使用lambda
    marry(()->{
        //使用this调用本类买房子的方法
        this.buyHouse();
    });
    /*
        使用引用优化lambda
     */
    marry(this::buyHouse);
}

public static void main(String[] args) {
    new Husband().Happy();
}
}
/*
定义一个富有的函数式接口
*/
@FunctionalInterface
public interface Richable {
void buy();
}

构造方法引用

/*
类的构造器 构造方法引用
*/

public class demo {
//定义一个方法,参数传递姓名和PersonBuilder接口,方法通过姓名创建Person对象
public static void printName(String name, PersonBuilder pb){
    Person person = pb.builderPerson(name);
    System.out.println(person.getName());
}

public static void main(String[] args) {
    //调用printName  方法的参数有函数式接口 可以传递lambda
    printName("jackboy",(String name)->{
        return new Person(name);
    });
    /*
        使用方法引用优化
     */
    printName("jackboy",Person::new);
}
}
/*
定义一个创建Person对象的函数式接口
 */
@FunctionalInterface
public interface PersonBuilder {
Person builderPerson(String name);
}
public class Person {
private String name;

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public Person() {
}

public Person(String name) {
    this.name = name;
}
}

数组的构造器引用

/*
数组的构造器引用
*/

public class demo02 {
/*
    定义一个方法 方法的参数传递创建数组的长度和ArrayBuilder接口
    方法内部根据传递的长度使用ArrayBuilder中的方法创建数组并返回
 */
public static int[] creatArray(int length,ArrayBuilder ab){
    return ab.builderArray(length);
}

public static void main(String[] args) {
    //调用方法 传递数组的长度和优化lambda表达式
    int[] ints = creatArray(10, int[]::new);
    System.out.println(ints.length);
    System.out.println(Arrays.toString(ints));
}
}
/*
定义一个创建数组的函数式接口
*/

@FunctionalInterface
public interface ArrayBuilder {
//定义一个创建int类型数组的方法,参数传递数组的长度,返回创建好的int类型数组
int[] builderArray(int length);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值