《JAVA EE》内部类(下篇)&Lambda表达式的注意事项

简介: 《JAVA EE》内部类(下篇)&Lambda表达式的注意事项

前言

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

《JAVA EE》内部类(上篇)

接下来将详细介绍匿名内部类以及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);
}

==注意事项:==

  1. 匿名内部类也是方法内部类中的一种,最多用在方法形参中。
  2. 接口无法直接实例化对象的,因此我们此处的new的是IMessage接口的子类,只不过这个子类只在fun方法中使用一次在这里插入图片描述
  3. 这个小括号里面的其实就是匿名内部类,实现了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();
    }
}

==注意:==

  1. 如果一个接口只有一个抽象方法,那么该接口就是一个函数式接口。
  2. 如果我们在某个接口上声明了 @FunctionalInterface 注解,那么编译器就会按照函数式接口的定义来要求该接口,这样如果有两个抽象方法,程序编译就会报错的。所以,从某种意义上来说,只要你保证你的接口中只有一个抽象方法,你可以不加这个注解。加上就会自动进行检测的。
  3. 接口中有普通方法但只有一个抽象方法也是可以满足函数式接口定义的。在这里插入图片描述

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表达式的优点很明显,在代码层次上来说,使代码变得非常的简洁。缺点也很明显,代码不易读。

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

若对各位老铁有帮助的话,求个点赞+关注+收藏,后续博主将持续更新更多的干货~~感谢!!!

相关文章
|
1天前
|
Java API 开发者
Java中的Lambda表达式与函数式编程####
在Java的演变过程中,Lambda表达式和函数式编程的引入无疑是一次重大的飞跃。本文将深入探讨Lambda表达式的定义、用法及优势,并结合实例说明如何在Java中利用Lambda表达式进行函数式编程。通过对比传统编程方式,揭示Lambda表达式如何简化代码、提高开发效率和可维护性。 ####
|
10天前
|
自然语言处理 安全 Java
Aviator Java 表达式引擎
AviatorScript 是一门高性能、轻量级寄宿于 JVM 之上的脚本语言。
25 10
|
7天前
|
Java API 数据处理
探索Java中的Lambda表达式与Stream API
【10月更文挑战第22天】 在Java编程中,Lambda表达式和Stream API是两个强大的功能,它们极大地简化了代码的编写和提高了开发效率。本文将深入探讨这两个概念的基本用法、优势以及在实际项目中的应用案例,帮助读者更好地理解和运用这些现代Java特性。
|
11天前
|
Java API
[Java]Lambda表达式
本文主要介绍了Java中的Lambda表达式,包括其优化匿名内部类的方式、使用规范、内置函数式接口及方法引用等内容。文章详细解析了Lambda的基础语法、参数列表、方法体的简化规则,以及如何利用Lambda优化代码。此外,还探讨了Lambda的作用域和引用规则,强调了对局部变量、成员变量和常量的访问限制,旨在帮助读者全面理解和掌握Lambda表达式的应用。
10 0
[Java]Lambda表达式
|
12天前
|
JSON Java 开发工具
Java服务端集成Google FCM推送的注意事项和实际经验
本文分享了作者在公司APP海外发布过程中,选择Google FCM进行消息推送的集成经验。文章详细解析了Java集成FCM推送的多种实现方式,包括HTTP请求和SDK集成,并指出了通知栏消息和透传消息的区别与应用场景。同时,作者还探讨了Firebase项目的创建、配置和服务端集成的注意事项,帮助读者解决文档混乱和选择困难的问题。
17 1
|
20天前
|
Java 程序员 API
Java中的Lambda表达式:简化代码的秘密武器
【10月更文挑战第11天】 在Java编程中,Lambda表达式是一种简洁而强大的工具,它允许我们将函数作为参数传递给其他方法。本文将介绍Lambda表达式的基本概念、使用方法以及在实际项目中的应用案例,帮助你更好地理解和利用这一特性来简化代码。
21 8
|
14天前
|
Java 测试技术 开发者
🌟Java零基础-Lambda运算符详解 🌟
【10月更文挑战第12天】本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
18 1
|
23天前
|
并行计算 Java API
Java中的Lambda表达式及其应用
本文将深入探讨Java中的Lambda表达式,从基本概念到实际应用。我们将了解Lambda表达式的定义、优势和使用场景,并通过实例展示其在Java编程中的强大功能。无论是初学者还是经验丰富的开发者,都可以从中获得有价值的见解。
|
22天前
|
Java
让星星⭐月亮告诉你,jdk1.8 Java函数式编程示例:Lambda函数/方法引用/4种内建函数式接口(功能性-/消费型/供给型/断言型)
本示例展示了Java中函数式接口的使用,包括自定义和内置的函数式接口。通过方法引用,实现对字符串操作如转换大写、数值转换等,并演示了Function、Consumer、Supplier及Predicate四种主要内置函数式接口的应用。
20 1
|
6天前
|
安全 Java
java 中 i++ 到底是否线程安全?
本文通过实例探讨了 `i++` 在多线程环境下的线程安全性问题。首先,使用 100 个线程分别执行 10000 次 `i++` 操作,发现最终结果小于预期的 1000000,证明 `i++` 是线程不安全的。接着,介绍了两种解决方法:使用 `synchronized` 关键字加锁和使用 `AtomicInteger` 类。其中,`AtomicInteger` 通过 `CAS` 操作实现了高效的线程安全。最后,通过分析字节码和源码,解释了 `i++` 为何线程不安全以及 `AtomicInteger` 如何保证线程安全。
java 中 i++ 到底是否线程安全?