Lambda表达式简析-2( Lambda方法引用)

Lambda方法引用

在lambda方法体中,有些功能已经实现了,就可以使用方法引用。
主要格式有以下几种:
1. 对 象 :: 实例方法名

import java.util.function.Function;
import java.util.function.Supplier;
/*
对 象  ::  实例方法名
 */
public class Demo001 {
    public static void main(String[] args) {
        //目的一: 返回一个String
        //无参 有返回的 lambda返回值方法 可以使用Supplier接口
        //原始写法
        Supplier<String> s=()->{return ("Hello");};
        //调用Supplier接口中的get()方法返回并打印
        System.out.println("原始写法:"+s.get());

        //方法引用写法
        Supplier<String> s1=new Test()::getMsg;
        //调用Supplier接口中的get()方法返回并打印
        System.out.println("引用写法:"+s1.get());

        //目的二:将helloWorld 重复指定次数,返回出去
        //有参有返回值可以使用Function接口 R apply(T t)
        //原始写法
        Function<Integer,String> f=(num)->{
            //创建StringBuilder对象存放字符串
            StringBuilder sb=new StringBuilder();
            for(int i=0;i<num;i++){
                //添加字符串
                sb.append("helloWorld ");
            }
            //返回String 类型字符串
                return sb.toString();
        };
        System.out.println("打印一:");
        System.out.println(f.apply(5));
        //方法引用写法
        Function<Integer,String> f1=new Test()::copyN;
        System.out.println("打印二:");
        System.out.println(f1.apply(5));
    }
}

class Test{

    // 方法的功能返回一个String  无参有返回值
    public String getMsg(){
        //返回值
        return "Hello.";
    }

    //将helloWorld 重复指定次数,返回出去    有参 有返回值
    public String copyN(int num){
        //创建StringBuilder对象存放字符串
        StringBuilder sb=new StringBuilder();
        for(int i=0;i<num;i++){
            //添加字符串
            sb.append("helloWorld ");
        }
        //返回String 类型字符串
        return sb.toString();
    }

}

2. 类 :: 静态方法名

import java.util.Comparator;
/*
 类   ::   静态方法名
 */
public class Demo003 {
    public static void main(String[] args) {
        int a=100;
        int b=20;
        //手动比较
        if(a>b){
            System.out.println(1);
        }else if(a<b){
            System.out.println(-1);
        }else{
            System.out.println(0);
        }
        System.out.println("-----------------");
        //Integer中compare方法比较
        System.out.println(Integer.compare(a,b));

        System.out.println("------------------");
        //Comparator接口lambda比较
        Comparator<Integer> c=(x,y)->{return x>y?1:(x<y?-1:0);};
        System.out.println("原始写法打印:"+c.compare(a, b));
        //调用Integer中的静态方法compare
        Comparator<Integer> c1=Integer::compare;
        System.out.println("新写法打印:"+c1.compare(a,b));
    }
}

3.类::实例方法名

import java.util.function.BiPredicate;
/*
类::实例方法名
 */
public class Demo004 {
    public static void main(String[] args) {
        // 判断两个String数据是否相等
        String s1="abc";
        String s2="abc";
        //实例方法调用非静态方法
        //
        System.out.println(s1.equals(s2));
        //调用BiPredicate接口中的test方法   有参有返回值
        //原始写法
        BiPredicate<String,String> b=(x1,x2)->{
            return x1.equals(x2);
        };
        System.out.println("原方法打印:"+b.test(s1,s2));
		//新写法
        BiPredicate<String, String> b1=String::equals;
        System.out.println("新方法打印:"+b1.test(s1,s2));
    }
}

4.构造器引用
类::new

/*
类::new
 */
public class Demo005 {
    public static void main(String[] args) {
        //创建个人对象
        Person p=new Person("张水水");
        //打印信息
        p.printInf();
        //自定义接口函数,原始写法
        MyFunIn<Person,String> m=(name)->{return new Person(name);};
        System.out.println(m.get("赵敏"));
        //自定义接口函数,新写法
        MyFunIn<Person,String> m1=Person::new;
        System.out.println(m1.get("张无忌"));
    }
}

@FunctionalInterface
interface MyFunIn<T,E>{
    T get(E str);
}
//Person类
class Person{
    private String name;

    public Person() {
    }

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

    public String getName() {
        return name;
    }

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

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                '}';
    }
    public void printInf(){
        System.out.println(toString());
    }
}

注意:需要调用的构造器的参数列表要与函数式接口中抽象方法参数列表保持一致。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值