内部类和匿名函数的定义和使用
内部类
内部类是指在一个类的内部定义另一个类。内部类和外部类之间可以互相访问对方的成员,内部类可以被当做一个独立的实体来使用,外部类可以通过创建内部类的对象来访问内部类的成员。
内部类的定义格式如下:
class Outer {
int x = 10;
void doSomething() {
class Inner {
void doSomethingElse() {
System.out.println(x);
}
}
Inner inner = new Inner();
inner.doSomethingElse();
}
}
在上面的例子中,内部类 Inner 的定义在 doSomething 方法中,通过创建 Inner 的对象 inner 来访问内部类的方法 doSomethingElse。注意到在 Inner 的方法中可以访问外部类的成员 x。
内部类的使用场景主要有以下几个方面:
1. 实现回调函数
回调函数是指一个函数被作为入参传递给另一个函数,在另一个函数执行完毕后调用传递进来的函数。内部类可以很方便地实现回调函数的功能,内部类对象可以被传递给一个函数作为入参,在函数执行完毕后调用内部类对象的方法。
2. 实现迭代器
迭代器是一种常见的数据结构,用于遍历一个容器中的元素,内部类可以很方便地实现迭代器的功能,内部类可以访问容器对象的成员,也可以被容器对象调用,对容器中的元素进行操作。
3. 防止命名冲突
在一个类中可能会定义多个同名的变量或方法,为了避免命名冲突,可以定义一个内部类来封装变量或方法,这样内部类中的成员就可以与外部类中的成员同名,但不会产生冲突。
匿名函数
匿名函数是指没有名字的函数,通常用于回调函数或函数式编程中。匿名函数可以直接在代码中定义,并且可以直接作为参数传递给另一个函数或方法。
Java 中的匿名函数一般使用 lambda 表达式来定义,lambda 表达式的基本语法为:
(parameters) -> expression
其中 parameters 指函数的参数列表,可以是多个参数,用逗号隔开,expression 指函数体,可以是一个表达式或一个代码块。例如:
Runnable task = () -> System.out.println("Hello, World!");
在上面的例子中,定义了一个 Runnable 类的匿名对象 task,使用 lambda 表达式定义了其 run 方法的函数体,直接输出了一行字符串。
Java 中的 lambda 表达式可以使用方法引用来进一步简化,方法引用可以将一个方法或构造函数引用为一个 lambda 表达式,例如:
Function<Integer, Integer> square = x -> x * x; Function<Integer, Integer> square2 = Integer::valueOf;
在上面的例子中, 行代码使用 lambda 表达式定义了一个名为 square 的函数,其参数类型为 Integer,返回值类型为 Integer,函数体是 x 的平方;第二行代码使用方法引用将 Integer 类的 valueOf 方法引用为一个 lambda 表达式,用于创建 Integer 类型的对象。
