美文网首页
Java中的匿名类与Lambda表达式

Java中的匿名类与Lambda表达式

作者: RaiseHead | 来源:发表于2019-12-27 14:05 被阅读0次

匿名类

匿名类是一个没有名称的内部类,并且只能创建一个对象实例。当要实现某些“额外”功能(例如类或接口的重载方法)来创建对象的实例时,匿名类可能很有用,这时不必实际子类化。

匿名类主要以两种方式创建:

  • 继承类(可以是抽象的或具体的)
  • 实现接口

Java引入了匿名类的创建,以减少代码复杂性。如果我们创建一个单独的类来实现一个接口并使用它的实例来调用该方法,则会产生开销。而当我们从不在其他任何地方使用该类的话这个开销就会显得有些浪费。在这种情况下,我们可以使用匿名类,它们既可以在方法主体内部创建,也可以作为方法参数创建。

Lambda表达式

Lambda表达式是Java 8中引入的一项新功能。Lambda表达式是一个匿名函数。没有名称且不属于任何类的函数。

Lambda表达式是用来表示功能接口的实例(具有单一抽象方法的接口称为功能接口。比如java.lang.Runnable)。lambda表达式实现其中唯一的抽象函数,这个接口被称为函数式接口。

要创建lambda表达式,我们在lambda运算符->的左侧指定输入参数(如果有的话),然后将表达式或语句块放在lambda运算符的右侧。例如,lambda表达式:(x,y)-> x + y
指定lambda表达式有两个参数x和y并返回它们的和。

// lambda表达式的语法
(parameter_list )-> { function_body }

lambda表达式提供了以下功能:

  • 启用可将功能视为方法参数,或将代码视为数据。
  • 可以创建而不属于任何类的函数。
  • 可以将lambda表达式作为对象传递并按需执行。

程序示例

接口

public interface Animal {
    public void eat();
}

常规接口实现

public class SeaAnimal implements Animal{

    @Override
    public void eat() {
        System.out.println("SeaAnimal class implementing eat()");
    }

}

public class Test {
    public static void main(String[] args) {
        Animal animal = new SeaAnimal();
        animal.eat();
    }
}

匿名类

public class Test1 {
    public static void main(String[] args) {
        Animal animal = new Animal() {

            @Override
            public void eat() {
                System.out.println("Anonymous class implementing eat()");
            }

        };

        animal.eat();
    }
}

Lambda表达式

public class Test2 {
    public static void main(String[] args) {
        Animal animal = ()->System.out.println("Lambda Expression implementing eat()"); 
        animal.eat();
    }
}

我们可以看到使用Lambda表达式如何使代码更简单。但是请注意,并非所有匿名类都可以用Lambda表达式代替。

它们之间的区别

匿名类 Lambda表达式
没有名字的类 没有名称的方法(匿名函数)
它可以扩展抽象或具体的类 它不能扩展抽象或具体的类
它可以实现包含任何抽象方法的接口 它可以实现一个包含单个抽象方法的接口
匿名类可以具有实例变量和方法局部变量 Lambda表达式只能具有局部变量
可以实例化匿名内部类 Lambda 表达式无法实例化
在匿名内部类内部,“ this”始终是指当前匿名内部类对象,而不是外部对象 在Lambda表达式内部,“ this”始终引用当前的外部类对象,即包围类对象
如果我们要处理多种方法,这是最佳选择 如果我们要处理接口,这是最佳选择
在编译时,将生成一个单独的.class文件 在编译时,不会生成单独的.class文件。只是将其转换为外部类的私有方法
每当我们创建对象时,内存分配都是按需的 它驻留在JVM的永久内存中

相关文章

  • 深入浅出 Java 8 Lambda 表达式

    摘要:此篇文章主要介绍 Java8 Lambda 表达式产生的背景和用法,以及 Lambda 表达式与匿名类的不同...

  • lambda 和 匿名内部类的区别 this

    this关键字 匿名类匿名类的this关键字指向匿名类 lambda表达式lambda表达式的this关键字指向包...

  • kotlin中sam(函数式接口)

    用lambda表达式去表示java中的匿名类实例在使用java去给一个按钮设置监听我们通常会通过创建匿名类实例,如...

  • Kotlin中的sam(函数式接口)详解

    用lambda表达式去表示java中的匿名类实例在使用java去给一个按钮设置监听我们通常会通过创建匿名类实例,如...

  • Kotlin中sam(函数式接口)解析

    用lambda表达式去表示java中的匿名类实例在使用java去给一个按钮设置监听我们通常会通过创建匿名类实例,如...

  • [代码简化] 1 Lambda表达式

    1、lambda表达式 1.1 lambda 利用lambda表达式代替匿名参数类,将行为进行参数化传递到代码中,...

  • JDK10的新特性:var和匿名类

    简介 匿名类相信大家都用过了,学过JDK8中的lambda表达式之后,可以发现有些匿名类是可以用lambda表达式...

  • Java8笔记(3)

    Java8笔记(3) 从匿名类到 Lambda 表达式的转换 例子: 创建Runnable对象的匿名类 但是某些情...

  • 第七章 函数接口,lambda和方法引用

    java8 函数接口,lambda和方法引用 第四十二条, lambda 优先于匿名类(lambda表达式)1.函...

  • Java自学-Lambda 概念

    Java Lambda 表达式概念 假设一个情景: 找出满足条件的Hero从使用普通方法,匿名类,以及Lambda...

网友评论

      本文标题:Java中的匿名类与Lambda表达式

      本文链接:https://www.haomeiwen.com/subject/eukdoctx.html