欢迎访问宙启技术站
智能推送

Java函数 - 内部类与Lambda表达式

发布时间:2023-06-18 07:18:55

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中非常有用的语言功能,值得深入学习。