上一篇介绍了内部类的前三种类型,链接如下:
接下来将详细介绍匿名内部类以及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);
}
注意事项:


- Lambda表达式是Java SE 8中一个重要的新特性。lambda表达式允许你通过表达式来代替功能接口。
- lambda表达式就和方法一样,它提供了一个正常的参数列表和一个使用这些参数的主体(body,可以是一个表达式或一个代码块)。
- Lambda 表达式(Lambda expression)可以看作是一个匿名函数,基于数学中的λ演算得名,也可称为闭包(Closure) 。
要了解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 注解,那么编译器就会按照函数式接口的定义来要求该接口,这样如果有两个抽象方法,程序编译就会报错的。所以,从某种意义上来说,只要你保证你的接口中只有一个抽象方法,你可以不加这个注解。加上就会自动进行检测的。
接口中有普通方法但只有一个抽象方法也是可以满足函数式接口定义的。
能使用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表达式由三部分组成:

Lambda表达式有四种情况,对应抽象方法的四种分支。
定义以下四种接口:
interface HasParaHasReturn {
int test(int a,int b);
}
interface NoParaHasReturn {
int test();
}
interface HasParaNoReturn {
void test(int a);
}
interface NoParaNoReturn {
void test();
}

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


规则2:
若方法的参数只有一个,可以省略小括号
规则3:
可以省略Lambda表达式中的参数类型

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


Lambda表达式的优点很明显,在代码层次上来说,使代码变得非常的简洁。缺点也很明显,代码不易读。
若对各位老铁有帮助的话,求个点赞+关注+收藏,后续博主将持续更新更多的干货~~感谢!!!