Java函数 - 内部类与Lambda表达式
Java是一种面向对象的编程语言,它最大的特点就是支持高级抽象机制,其中函数就是其中较为重要的一个机制。作为一种面向对象的语言,Java将函数作为对象的一部分来处理,因此Java中的函数通常被称为方法。Java中的方法可以包含Java内部类和Lambda表达式,本篇文章将介绍Java中的内部类与Lambda表达式。
1. Java内部类
Java内部类指的是在其他类中嵌套定义的类,它可以作为外部类的一个成员,也可以作为方法的局部变量,甚至可以作为方法的返回值。Java内部类与外部类之间可以相互访问私有成员、静态成员和非静态成员。Java内部类分为四种类型:成员内部类、局部内部类、匿名内部类和静态嵌套类。
1.1 成员内部类
顾名思义,成员内部类是定义在其他类中的类,它可以访问外部类的成员变量和方法。成员内部类的定义方式如下:
public class OuterClass {
private int a;
private int b;
public class InnerClass {
public void print() {
System.out.println("a = " + a + ", b = " + b);
}
}
}
在上面的代码中,InnerClass是OuterClass的成员内部类,它可以在OuterClass中访问a和b的值。下面的代码展示了如何在外部类中创建内部类对象:
OuterClass outerClass = new OuterClass();
OuterClass.InnerClass innerClass = outerClass.new InnerClass();
innerClass.print();
1.2 局部内部类
局部内部类是定义在方法中的类,这个类只能在方法体内被访问。作为方法的局部变量,局部内部类定义在方法内部,所以它不能用public或private来修饰,它只能用final修饰。定义局部内部类的代码如下:
public class OuterClass {
public void print(final int num) {
final int a = 10;
class InnerClass {
public void print() {
System.out.println("num = " + num + ", a = " + a);
}
}
InnerClass innerClass = new InnerClass();
innerClass.print();
}
}
在上面的代码中,InnerClass是OuterClass的局部内部类,它可以在print方法中访问num和a的值。注意到num和a都被final修饰,这是因为Java中的变量在内部类中使用时必须是final的。
1.3 匿名内部类
匿名内部类是没有名字的内部类,它通常用于创建只需要一次使用的对象。它的定义方式如下:
public class OuterClass {
public void print() {
new InnerInterface() {
@Override
public void print() {
System.out.println("Hello World!");
}
}.print();
}
interface InnerInterface {
void print();
}
}
在上面的代码中,InnerInterface是一个接口,print方法使用匿名内部类创建了一个实现InnerInterface接口的对象。注意到这个匿名内部类没有名称,它是在print方法内部被定义的。这种语法在处理事件时非常常用,因为它允许您在运行时创建自己的匿名对象。
1.4 静态嵌套类
静态嵌套类是定义在其他类中的静态类,与成员内部类相比,它没有访问外部类的成员变量和方法,是一个独立的类。定义静态嵌套类的代码如下:
public class OuterClass {
static class InnerClass {
public void print() {
System.out.println("Hello World!");
}
}
}
在上面的代码中,InnerClass是OuterClass的静态嵌套类,在程序中可以直接通过类名OuterClass.InnerClass来访问它的成员方法和成员变量。
2. Lambda表达式
Lambda表达式是Java 8中引入的一种新的语言特性,它允许您将一种函数作为另一种函数的参数传递。Lambda表达式通常用于方便地创建匿名函数,因此它也被称为匿名函数。Lambda表达式的语法比较简单,它由参数列表、箭头符号和函数体组成。例如,以下是一个简单的Lambda表达式,它将一个字符串转换为大写字母:
Function<String, String> upperCase = (str) -> str.toUpperCase();
在上面的代码中,箭头符号的左侧是参数列表,右侧是函数体,它将字符串转换为大写字母。
Lambda表达式可以传递给接受函数作为参数的方法,例如:
List<String> list = new ArrayList<>();
list.add("Java");
list.add("C++");
list.add("Python");
list.forEach(str -> System.out.println(str.toUpperCase()));
在上面的代码中,forEach方法接受一个函数作为参数,它用于将列表中的每个元素转换为大写字母并打印输出。
Lambda表达式也可以访问外部变量,例如:
int num = 10;
Function<Integer, Integer> addTen = (i) -> i + num;
在上面的代码中,Lambda表达式访问了外部变量num,它将num的值与参数i相加并返回结果。
总结
Java中的函数是Java程序中最常用的机制之一,Java内部类与Lambda表达式为Java中的函数机制提供了更多的灵活性和功能。内部类可以让您在其他类中定义一个新的类,它们可以在Java中充当闭包的角色,并且可以访问外部类的成员变量和方法。Lambda表达式则允许您轻松地创建匿名函数,并将它们作为另一种函数的参数传递。它们都是Java中非常有用的语言功能,值得深入学习。
