📜  Java中的闭包示例

📅  最后修改于: 2022-05-13 01:55:23.300000             🧑  作者: Mango

Java中的闭包示例

方法是执行某些特定任务并将结果返回给调用者的语句的集合。方法可以执行某些特定任务而不返回任何内容。方法允许我们在不重新键入代码的情况下重用代码。在Java中,每个方法都必须是某个类的一部分,这与 C、C++ 和Python等语言不同。在本文中,我们将了解一种名为闭包的函数。
在进入闭包之前,让我们首先了解什么是 lambda 表达式。 lambda 表达式基本上表达了功能接口的实例(具有单个抽象方法的接口称为功能接口)。一个例子是Java.lang.Runnable。 Lambda 表达式实现了唯一的抽象函数,因此实现了函数式接口。 Java 8 中添加了 Lambda 表达式,并提供以下功能:

  1. 启用将功能视为方法参数,或将代码视为数据。
  2. 可以在不属于任何类的情况下创建的函数。
  3. lambda 表达式可以像对象一样传递并按需执行。

lambda 表达式的主要限制是 lambda 表达式的作用域只能是最终的。也就是说,我们不能改变 lambda 表达式中变量的值。假设我们定义了一个 lambda 表达式,在其中我们增加了一个变量的值,它只会抛出一个错误。为了解决这个错误,已经定义了闭包。
闭包是内联函数值表达式,这意味着它们是具有有界变量的类函数。闭包可以作为参数传递给另一个函数。闭包让我们可以从内部函数。但是从Java 1.6 开始, Java不依赖闭包,或者Java没有闭包。此外,匿名内部类不是Java中的闭包。使用闭包有助于数据隐私和柯里化(柯里化意味着将具有多个参数的函数分解为单个参数中的多个函数)。尽管闭包的概念在 Javascript 中定义得更好,但闭包仍然可以使用 lambda 表达式来实现。实现闭包的语法是:

(argument_list) -> {func_body}

现在,让我们通过示例来了解如何实现闭包:

  • 示例 1:在此示例中,我们将首先实现一个不带参数或自变量的 lambda 表达式。
Java
// Java program to demonstrate
// how a closure is implemented
// using lambda expressions
 
import java.io.*;
 
// Defining an interface whose
// implementation is given in
// the lambda expression.
// This uses the concept of
// closures
interface SalutationInterface {
    public String salHello();
}
 
class GFG {
 
    // Driver code
    public static void main(String[] args)
    {
        // Lambda Expression
        SalutationInterface obj = () ->
        {
            return "Hello, GFGians!";
        };
 
        // Calling the above interface
        System.out.println(obj.salHello());
    }
}


Java
// Java program to demonstrate
// how a closure is implemented
// using lambda expressions
import java.io.*;
 
// Defining an interface whose
// implementation is given in
// the lambda expression.
// This uses the concept of
// closures
interface concatStrings {
    public String concat(String a,
                         String b);
}
 
class GFG {
 
    // Driver code
    public static void main(String[] args)
    {
        // Lambda Expression
        concatStrings s = (s1, s2)
            -> s1 + s2;
 
        System.out.println(
            s.concat("Hello, ",
                     "GFGians!"));
    }
}


Java
// Java program to demonstrate
// how a closure is implemented
// using lambda expressions
 
import java.io.*;
 
// Defining an interface whose
// implementation is given in
// the lambda expression.
// This uses the concept of
// closures
interface NumToMonth {
    public String convertToMonth(int x);
}
 
class GFG {
 
    // Driver code
    public static void main(String[] args)
    {
 
        // Lambda Expression
 
        NumToMonth obj = new NumToMonth() {
            String[] months = { "Jan", "Feb", "Mar",
                                "Apr", "May", "Jun",
                                "Jul", "Aug", "Sep",
                                "Oct", "Nov", "Dec" };
 
            public String convertToMonth(int n)
            {
                return (n > 0 && n <= months.length)
                    ? months[n - 1]
                    : null;
            };
        };
        System.out.println(obj.convertToMonth(8));
    }
}


输出:
Hello, GFGians!

  • 示例 2:在这个示例中,我们将了解如何实现带有多个参数的 lambda 表达式。

Java

// Java program to demonstrate
// how a closure is implemented
// using lambda expressions
import java.io.*;
 
// Defining an interface whose
// implementation is given in
// the lambda expression.
// This uses the concept of
// closures
interface concatStrings {
    public String concat(String a,
                         String b);
}
 
class GFG {
 
    // Driver code
    public static void main(String[] args)
    {
        // Lambda Expression
        concatStrings s = (s1, s2)
            -> s1 + s2;
 
        System.out.println(
            s.concat("Hello, ",
                     "GFGians!"));
    }
}
输出:
Hello, GFGians!

  • 示例 3:在本示例中,我们将使用自定义功能界面从提供的数字中显示月份。

Java

// Java program to demonstrate
// how a closure is implemented
// using lambda expressions
 
import java.io.*;
 
// Defining an interface whose
// implementation is given in
// the lambda expression.
// This uses the concept of
// closures
interface NumToMonth {
    public String convertToMonth(int x);
}
 
class GFG {
 
    // Driver code
    public static void main(String[] args)
    {
 
        // Lambda Expression
 
        NumToMonth obj = new NumToMonth() {
            String[] months = { "Jan", "Feb", "Mar",
                                "Apr", "May", "Jun",
                                "Jul", "Aug", "Sep",
                                "Oct", "Nov", "Dec" };
 
            public String convertToMonth(int n)
            {
                return (n > 0 && n <= months.length)
                    ? months[n - 1]
                    : null;
            };
        };
        System.out.println(obj.convertToMonth(8));
    }
}
输出:
Aug