368-372 方法引用

368 方法引用符

以e367的代码为例

usePrintable(s -> System.out.println(s));

  参数s,通过lambda表达式传递给sout方法

usePrintable(System.out::println);

  使用System.out的print方法取代lambda,更简洁

【可推导则可省略】

lambda表达式中,参数类型、重载形式可推导,故可省略

方法引用也是

方法引用是lambda表达式的孪生兄弟

【需求】

  1. 定义接口1个,在里面写抽象方法1个printInt(int i)
  2. 定义测试类1个,
    1. 定义方法1个,main,调用usePrintable
    2. 定义私有静态方法1个,usePrintable

---------------------------------------------

代码略

369 引用类方法

【引用类方法】

格式:类名::静态方法

例如:Integer::parseInt

【需求】

  1. 定义接口1个,在里面写抽象方法1个int convert(String s)
  2. 定义测试类1个,
    1. 定义方法1个,main,调用useConvert
    2. 定义私有静态方法1个,useConvert

(这需求和前2个课的一样)

---------------------------------------------

package e369;

public interface Converter {

    int converter(String s);

}

---------------------------------------------

package e369;

public class Demo {

    public static void main(String[] args) {

        useConverter((String s) -> {

            return Integer.parseInt(s);

        });

        useConverter(s -> Integer.parseInt(s));

        useConverter(Integer::parseInt);

//        lambda表达式被类方法替代的时候,它的形式参数全部传递给静态方法作为参数

    }

    private static void useConverter(Converter c) {

        int number = c.converter("666");

        System.out.println(number);

    }

}

/*

666

666

666

 */

370 引用对象的实例方法

引用对象的实例方法,其实就是引用类中的成员方法

格式:对象::成员方法

例如:“helloworld”::toUpperCase

【需求】

  1. 定义一个类
    1. 类里定义一个方法,把参数转为大写
  2. 定义一个接口,
    1. 接口里定义一个抽象方法,无返回值,参数String
  3. 定义一个测试类,
    1. 测试类里2个定义方法:main调用usePrinter,usePrinter

(接口、没有main的类有存在价值?)

---------------------------------------------

package e370;

public class PrintString {

    public void printUpper(String s) {

        String result = s.toUpperCase();

        System.out.println(result);

    }

}

---------------------------------------------

package e370;

public interface Printer {

    void printUpperCase(String s);

}

---------------------------------------------

package e370;

public class Demo {

    public static void main(String[] args) {

//A.lambda

        usePrinter(s -> System.out.println(s.toUpperCase()));

//B.method reference

        PrintString ps = new PrintString();

        usePrinter(ps::printUpper);

//        lambda表达式被类方法替代的时候,它的形式参数全部传递给静态方法作为参数

    }

    private static void usePrinter(Printer p) {

        p.printUpperCase("take your place");

    }

}

/*

TAKE YOUR PLACE

TAKE YOUR PLACE

 */

371 引用类的实例方法

引用类的实例方法,其实就是引用类中的成员方法

格式:类名::成员方法

例如:String::substring

> String类中有一个substring方法,可以截取字符串的一部分。从beginIndex开始,到endIndex为止,返回这之间的字符串

【练习需求】

定义一个MyString接口,里面定义一个抽象方法subString,需要3个参数:字符串、beginIndex、endIndex,返回String

定义一个测试类,定义一个useMyString方法并调用

【梳理】

先写接口,接口里写了方法名、参数。

然后写demo类的useJiekou方法,在这里提供参数,写屏。

切到main方法,用lambda的方式调用use方法。。。这里提供参数格式、方法体。

(use方法,指demo类里独立于main方法的方法)

(吐槽:use方法里的方法体有什么用,除了提供参数,没用啊?写屏操作根本没用到。。。又,参数格式写了n遍也是够了)

---------------------------------------------

package e371;

public interface Jiekou {

    public String jiequ(String juzi, int kaishi, int jieshu);

}

---------------------------------------------

package e371;

public class Demo {

    public static void main(String[] args) {

//下面用ABC 3种方案实现useJiekou

//A.lambda表达式

        useJiekou((String s, int beginIndex, int endIndex) -> {

            return s.substring(beginIndex, endIndex);

        });

//B.lambda表达式简写版

        useJiekou((s, beginIndex, endIndex) -> s.substring(beginIndex, endIndex));

//C.方法引用

        useJiekou(String::substring);

//        lambda表达式被类的实例方法替代的时候,第一个参数String作为调用者,后面的参数全部传递给该方法作为参数。

    }

    private static void useJiekou(Jiekou my) {

        String jieguo = my.jiequ("It's MOLE", 5, 9);

        System.out.println(jieguo);

    }

}

/*

MOLE

MOLE

MOLE

 */

372 引用构造器

引用构造器,就是引用构造方法

格式:类名::new

例如:String::new

【练习思路】

  1. 定义一个Kid类,
    1. 里面有2个成员变量-name、weight
    2. 并提供无参构造方法、带参构造方法、getter、setter
  2. 定义一个KidFood接口,
    1. 里面定义一个抽象方法-kidFood,参数是name、weight,返回Kid
  3. 定义一个测试类Demo,
    1. 在里面定义一个useKidFood方法,并调用

---------------------------------------------

package e372;

public class Kid {…}

---------------------------------------------

package e372;

public interface KidFood {

    Kid kidFood(String name,int weight);

}

---------------------------------------------

package e372;

public class Demo {

    public static void main(String[] args) {

//A.lambda表达式

        useKidFood((name, weight) -> new Kid(name, weight));

//B.引用构造方法

        useKidFood(Kid::new);

//          lambda表达式被构造器替代时,它的形式参数全部传递给构造器作为参数

    }

    public static void useKidFood(KidFood kf) {

        Kid k = kf.kidFood("pipi", 6);

        System.out.println(k.getName() + "," + k.getWeight());

    }

}

//pipi,6

//pipi,6

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值