资讯专栏INFORMATION COLUMN

你还不懂Lambda吗!

MAX_zuo / 3214人阅读

摘要:函数式接口可以包含多个默认方法类方法但只能一个抽象方法函数式接口有且只有一个没有关键字修饰的接口可以多个关键字的抽象方法类方法变量语法组成元素形参列表。

Lambda相当于就是一个匿名方法,其在代替匿名内部类创建对象的时候,Lambda表达式代码块会代替实现抽象方法的方法体

Lambda表达式的目标类型必须是“函数式接口(FunctionalInterface)”。函数式接口只能包含一个抽象方法接口。函数式接口可以包含多个默认方法、类方法、但只能一个抽象方法

函数式接口

有且只有一个没有default关键字修饰的接口

可以多个default关键字的抽象方法、类方法、变量

语法组成元素

形参列表。形参可以省略数据类型。若只有一个参数,可以将圆括号省略

箭头(->)

代码块。如果只有一条语句,Lambda表达式可以省略花括号。代码块只能有一条return语句,并且可以省略return关键字

public class Lam {
    @FunctionalInterface
    interface Try{
        Integer ss();
    }
    public static void main(String[] args) {
        Try i=()->"sa".indexOf("a");
        System.out.println(i.ss());
    }
}

Lambda的代码块中就是用来实现接口的抽象方法,而且有且只能有一个。若有default关键字的抽象方法是不属于函数式接口(FunctionalInterface)

存在@FunctionalInterface注解的一定是函数式接口,没有@FunctionalInterface不一定就不是函数式接口

public class Lam {
    @FunctionalInterface
    interface Try {
        String s = "1";
        Integer ss();
        default Integer bb() {
            return 0;
        }

    }

    public static void main(String[] args) {
        Try i = () -> "sa".indexOf("a");
        System.out.println(i.s);
        System.out.println(i.ss());
    }
}
方法引用与构造器引用
种类 示例 说明 对应的Lambda表达式
引用类方法 类名::类方法 函数式接口中实现的方法的全部参数都传递给类方法作为参数 (a,b,...)->类名.类方法(a,b,...)
特定对象的实例方法 对象::实例方法 函数式接口中实现的方法的全部参数都传递给类方法作为参数 (a,b,...)->对象.实例方法(a,b,...)
引用某类对象的实例方法 类名::实例方法 函数式接口中实现的方法第一个参数作为调用者,之后的参数都作为方法的参数 (a,b,...)->a.实例方法(b,...)
引用构造方法 类名::new 函数式接口中实现的方法的全部参数都传递给类方法作为参数 (a,b,...)->类名.new(a,b,...)

使用::这种方式,抽象方法肯定是存在参数的

其实上面三类可以归为一类来看待,这是形式不同而已

public class Lam {
    @FunctionalInterface
    interface Try {
        String s = "1";
        Integer ss(String s);
        default Integer sb() {
            return 0;
        }

    }

    public static void main(String[] args) {
        Try i = "sa"::indexOf;
        System.out.println(i.s);
        System.out.println(i.ss("a"));
    }

引用构造方法

public class Lam {
    @FunctionalInterface
    interface Try {
        String s = "1";
        String ss(String s);
        default Integer sb() {
            return 0;
        }

    }

    public static void main(String[] args) {
        Try i = String::new;
        System.out.println(i.s);
        System.out.println(i.ss("a"));
    }

等价于

public class Lam {
    @FunctionalInterface
    interface Try {
        String s = "1";
        String ss(String s);
        default Integer sb() {
            return 0;
        }

    }

    public static void main(String[] args) {
        Try i = new Try(){
            @Override
            public String ss(String s) {
                return new String(s);
            }
            
        };
        System.out.println(i.s);
        System.out.println(i.ss("a"));
    }
Lambda表达式与匿名函数的异同点

Lambda表达式与匿名内部类一样,都可以直接访问“effectivly final”的局部变量,以及外部类的成员变量(包括实例变量和类变量)

Lambda表达式创建的对象与匿名内部类生成的对象一样,都可以直接调用从接口中继承的默认方法

匿名内部类可以为任意接口创建实例——不管接口包含多少抽象方法,只要匿名内部类实现所有的抽象方法即可;但Lambda表达式只能为函数式接口创建实例

匿名内部类可以为抽象类甚至普通类创建实例;但Lambda表达式只能为函数式接口创建实例

匿名内部类实现的抽象方法的方法体运行调用接口中定义的默认方法;但Lambda表达式的代码块不允许调用接口中定义的默认方法

更多内容可以关注微信公众号,或者访问AppZone网站

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/65933.html

相关文章

  • 使用Intellij IDEA 解决Java8的数据流问题

    摘要:使用解决的数据流问题原文译者飞龙协议在年三月发布,距离现在年三月五号快有一年了。除了,最实用的特性是新的数据流。是吧,注是浏览器上的数据流的接口,并解决了上述问题。 使用Intellij IDEA 解决Java8的数据流问题 原文:Fixing Java 8 Stream Gotchas with IntelliJ IDEA 译者:飞龙 协议:CC BY-NC-SA 4.0 ...

    dreamGong 评论0 收藏0
  • 使用 Authing + Lambda 替代 AWS Cognito

    摘要:编写函数编写函数推荐使用这个,控制台中的函数编写堪称让人痛不欲生。在控制台中安装在中引入包后会一起打包上传到运行时中。 Amazon Web Services(AWS) 虽然作为市场份额全球第一的云计算厂商,其产品也不是完美无缺的,Cognito (AWS 的身份认证解决方案)及其附带的中文文档就是一个反面教材,其难用程度令人发指。当然,除了不易用之外,还有访问速度缓慢,不适用于中国市...

    Vultr 评论0 收藏0
  • 《Java8实战》-第三章读书笔记(Lambda表达式-01)

    摘要:之前,使用匿名类给苹果排序的代码是的,这段代码看上去并不是那么的清晰明了,使用表达式改进后或者是不得不承认,代码看起来跟清晰了。这是由泛型接口内部实现方式造成的。 # Lambda表达式在《Java8实战》中第三章主要讲的是Lambda表达式,在上一章节的笔记中我们利用了行为参数化来因对不断变化的需求,最后我们也使用到了Lambda,通过表达式为我们简化了很多代码从而极大地提高了我们的...

    longshengwang 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<