关于JavaEE匿名内部类和Lambda表达式的注意事项

 更新时间:2023年03月24日 16:46:21   作者:Killing Vibe  
这篇文章主要介绍了关于JavaEE匿名内部类和Lambda表达式的注意事项,匿名内部类顾名思义是没有修饰符甚至没有名称的内部类,使用匿名内部类需要注意哪些地方,我们一起来看看吧

前言

上一篇介绍了内部类的前三种类型,链接如下:

关于JavaEE内部类的部分注意事项

接下来将详细介绍匿名内部类以及Lambda表达式的用法和注意事项。

一、匿名内部类

定义在方法中(方法的形参或者实参),没有任何权限修饰符,甚至连类名称都没有的内部类称为匿名内部类

public class NoNameClass {
    public static void main(String[] args) {
        Queue<Integer> queue = new PriorityQueue<>(new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                return 0;
            }
        });
        fun(new IMessage() {
            @Override
            public void getMsg(String msg) {

            }
        });
    }

    public static void fun(IMessage message) {
        message.getMsg("测试匿名内部类");
    }
}

interface IMessage {
    void getMsg(String msg);
}

注意事项:

匿名内部类也是方法内部类中的一种,最多用在方法形参中。接口无法直接实例化对象的,因此我们此处的new的是IMessage接口的子类,只不过这个子类只在fun方法中使用一次

在这里插入图片描述

这个小括号里面的其实就是匿名内部类,实现了Comparator接口,覆写了compare方法

在这里插入图片描述

二、Lambda表达式

1.背景

Lambda表达式是Java SE 8中一个重要的新特性。lambda表达式允许你通过表达式来代替功能接口。lambda表达式就和方法一样,它提供了一个正常的参数列表和一个使用这些参数的主体(body,可以是一个表达式或一个代码块)。Lambda 表达式(Lambda expression)可以看作是一个匿名函数,基于数学中的λ演算得名,也可称为闭包(Closure) 。

2.函数式接口

要了解Lambda表达式,首先需要了解什么是函数式接口,函数式接口定义:一个接口有且只有一个抽象方法

@FunctionalInterface
// JDK8之后再接口中拓展了普通方法(存在方法体,普通方法,不是抽象方法,该接口的所有子类都有)
public interface NewInterface {
    // test仍然是一个抽象方法,没有方法体
    void test();

    default void test1() {
        System.out.println("接口中的普通方法");
    }
}
class InterFaceImpl implements NewInterface {
    @Override
    public void test() {

    }
}

class Main {
    public static void main(String[] args) {
        InterFaceImpl a = new InterFaceImpl();
        a.test1();
    }
}

注意

如果一个接口只有一个抽象方法,那么该接口就是一个函数式接口。

如果我们在某个接口上声明了 @FunctionalInterface 注解,那么编译器就会按照函数式接口的定义来要求该接口,这样如果有两个抽象方法,程序编译就会报错的。所以,从某种意义上来说,只要你保证你的接口中只有一个抽象方法,你可以不加这个注解。加上就会自动进行检测的。

接口中有普通方法但只有一个抽象方法也是可以满足函数式接口定义的。

在这里插入图片描述

3.Lambda表达式的语法

能使用Lambda表达式的前提就是接口必须是函数式接口,只有唯一的一个抽象方法。

@FunctionalInterface
interface FuncInterface {
    void test();
}
public class LambdaTest {
    public static void main(String[] args) {
        // 匿名内部类
        fun(new FuncInterface() {
            @Override
            public void test() {
                System.out.println("匿名内部类实现了FuncInterface接口");
            }
        });
        fun(() -> {
            System.out.println("Lambda表达式实现了FuncInterface接口");
        });
    }
    public static void fun(FuncInterface fi) {
        fi.test();
    }
}

基本语法:
(parameters) -> expression(parameters) ->{ statements; }

Lambda表达式由三部分组成:

  1. paramaters:类似方法中的形参列表,这里的参数是函数式接口里的参数。这里的参数类型可以明确的声明也可不声明而由JVM隐含的推断。另外当只有一个推断类型时可以省略掉圆括号。
  2. ->:可理解为“被用于”的意思。
  3. 方法体:可以是表达式也可以代码块,是函数式接口里方法的实现。代码块可返回一个值或者什么都不反回,这里的代码块块等同于方法的方法体。如果是表达式,也可以返回一个值或者什么都不反回。

在这里插入图片描述

所以Lambda表达式就是一个匿名函数,可以当做实参传入方法中。当方法声明中有形参要求传入一个实现某个接口的子类时,就可以使用匿名内部类,若此接口符合函数式接口,则可改写成Lambda表达式。

4.Lambda表达式的基本使用

Lambda表达式有四种情况,对应抽象方法的四种分支。

定义以下四种接口:

interface HasParaHasReturn {
    int test(int a,int b);
}


interface NoParaHasReturn {
    int test();
}

interface HasParaNoReturn {
    void test(int a);
}

interface NoParaNoReturn {
    void test();
}

(1)无返回值无参数

在这里插入图片描述

规则1:若方法体只有一行代码,则可以省略{}

在这里插入图片描述

(2)无返回值有参数

在这里插入图片描述

规则2:若方法的参数只有一个,可以省略小括号

规则3:可以省略Lambda表达式中的参数类型

(3)有返回值无参数

在这里插入图片描述

规则4:若抽象方法存在返回值并且返回的方法体只有一行,此时方法体的大括号,return都可以省略。

在这里插入图片描述

(4)有返回值有参数

在这里插入图片描述

总结

Lambda表达式的优点很明显,在代码层次上来说,使代码变得非常的简洁。缺点也很明显,代码不易读。

优点: 代码简洁,开发迅速方便函数式编程非常容易进行并行计算Java 引入 Lambda,改善了集合操作 缺点: 代码可读性变差在非并行计算中,很多计算未必有传统的 for 性能要高不容易进行调试

到此这篇关于关于JavaEE匿名内部类和Lambda表达式的注意事项的文章就介绍到这了,更多相关java匿名内部类和Lambda表达式内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 详解Java-Jackson使用

    详解Java-Jackson使用

    这篇文章主要介绍了Java-Jackson使用详解,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-03-03
  • Spring中利用IOC实现注入的方式

    Spring中利用IOC实现注入的方式

    Spring IOC(控制反转)实现依赖注入,将对象创建和依赖关系的管理交由Spring容器处理,通过注解或XML配置,实现对象之间的松耦合,提高代码复用性和可维护性
    2023-04-04
  • Spring基于注解读取外部配置文件

    Spring基于注解读取外部配置文件

    这篇文章主要介绍了Spring基于注解读取外部配置文件,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-12-12
  • 解决jar包rar压缩后无法运行问题

    解决jar包rar压缩后无法运行问题

    这篇文章主要介绍了解决jar包rar压缩后无法运行问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-05-05
  • spring scheduled单线程和多线程使用过程中的大坑

    spring scheduled单线程和多线程使用过程中的大坑

    本文主要介绍了spring scheduled单线程和多线程使用过程中的大坑,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01
  • java中ThreadPoolExecutor常识汇总

    java中ThreadPoolExecutor常识汇总

    这篇文章主要介绍了java中ThreadPoolExecutor常识汇总,线程池技术在并发时经常会使用到,java中的线程池的使用是通过调用ThreadPoolExecutor来实现的,需要的朋友可以参考下
    2019-06-06
  • Spring依赖注入与第三方Bean管理基础详解

    Spring依赖注入与第三方Bean管理基础详解

    依赖注入(Dependency Injection)和控制反转(Inversion of Control)是同一个概念。具体含义是:当某个角色(可能是一个Java实例,调用者)需要另一个角色(另一个Java实例,被调用者)的协助时,在 传统的程序设计过程中,通常由调用者来创建被调用者的实例
    2022-12-12
  • SpringBoot 实现CAS Server统一登录认证的详细步骤

    SpringBoot 实现CAS Server统一登录认证的详细步骤

    ​ CAS(Central Authentication Service)中心授权服务,是一个开源项目,目的在于为Web应用系统提供一种可靠的单点登录,这篇文章主要介绍了SpringBoot 实现CAS Server统一登录认证,需要的朋友可以参考下
    2024-02-02
  • 深入了解Java I/O 之File类

    深入了解Java I/O 之File类

    这篇文章主要介绍了Java I/O深入学习之File和RandomAccessFile, I/O系统即输入/输出系统,对于一门程序语言来说,创建一个好的输入/输出系统并非易事。需要的朋友可以参考下
    2021-08-08
  • 解决Mybatis返回update后影响的行数问题

    解决Mybatis返回update后影响的行数问题

    这篇文章主要介绍了解决Mybatis返回update后影响的行数问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-11-11

最新评论