method 是执行某些特定任务并将结果返回给调用者的语句的集合。方法可以执行某些特定任务而不返回任何内容。方法允许我们重用代码而无需重新输入代码。在 Java 中,每个方法都必须是某个类的一部分,这与 C、C++ 和 Python 等语言不同。在本文中,我们将了解一种名为闭包的函数。
Java 中的 Lambda 表达式
在讨论闭包之前,我们首先了解什么是 lambda 表达式。 lambda expression 本质上表示函数式 interfaces 的实例(具有单个抽象方法的接口称为函数式接口)。一个例子是 java.lang.Runnable 。
Lambda 表达式的函数
Lambda 表达式仅实现抽象函数,因此实现函数式接口。 Java 8 中添加了 Lambda 表达式,并提供以下函数:
- 允许将函数视为方法参数,或将代码视为数据。
- 可以创建不属于任何类的函数。
- lambda 表达式可以像对象一样传递并按需执行。
lambda 表达式的主要限制是 lambda 表达式的范围只能是最终的。也就是说,我们无法更改 lambda 表达式中变量的值。假设我们定义一个 lambda 表达式,在其中递增变量的值,它只会抛出一个错误。为了解决这个错误,定义了闭包。
Lambda 表达式的示例
示例 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();
}
// Driver Class
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());
}
}
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);
}
// Driver Class
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!
Java 中的闭包
闭包是 inline-function 值表达式,这意味着它们是具有有界变量的类函数。闭包可以作为参数传递给另一个函数。闭包使我们能够从内部函数访问外部函数。但从 Java 1.6 开始,Java 不依赖闭包或者 Java 没有闭包。另外,匿名内部类不是 Java 中的闭包。使用闭包有助于数据隐私和柯里化(柯里化意味着将具有多个参数的函数分解为单个参数中的多个函数)。尽管闭包的概念在Javascript,闭包仍然可以使用 lambda 表达式来实现。
Java 闭包语法
实现闭包的语法是:
(argument_list) -> {func_body}
Java 闭包的示例
现在,让我们通过示例来了解如何实现闭包:
示例 1:在此示例中,我们将使用自定义函数接口来显示提供的数字中的月份。
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);
}
// Driver Class
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
示例 2:
Java
// Java Pogram to implement
// to calculate the result
// using Closure and lamda methods
@FunctionalInterface
public interface Operation {
void operate(int n);
}
ClosureExample.java package com.javatpoint;
public class GFG {
public static void main(String args[])
{
int a = 12;
int b = 88;
// implementation of closure in lambda expression
temp(a, new Operation() {
// overrides the operate() method
@Override public void operate(int n)
{
// prints the result
System.out.println("Result is: " + (n + b));
}
});
}
private static void temp(int i, Operation op)
{
op.operate(i);
}
}
输出:
Result is: 100
闭包与 Lambda
lambda 和闭包彼此非常相似,可以通过类和类实例之间的差异来理解差异。类只存在于源代码中,在运行时不存在。运行时只有类类型的对象。类似地,闭包之于 lambda 就如同对象之于类一样。
相关用法
- Java ClosedChannelException用法及代码示例
- Java Closeable用法及代码示例
- Java Clock equals()用法及代码示例
- Java Clock fixed()用法及代码示例
- Java Clock getZone()用法及代码示例
- Java Clock hashCode()用法及代码示例
- Java Clock instant()用法及代码示例
- Java Clock millis()用法及代码示例
- Java Clock offset()用法及代码示例
- Java Clock system()用法及代码示例
- Java Clock systemDefaultZone()用法及代码示例
- Java Clock systemUTC()用法及代码示例
- Java Clock tick()用法及代码示例
- Java Clock tickSeconds()用法及代码示例
- Java Clock tickMinutes()用法及代码示例
- Java Clock withZone()用法及代码示例
- Java CloneNotSupportedException用法及代码示例
- Java Cloneable用法及代码示例
- Java ClassLoader.clearAssertionStatus()用法及代码示例
- Java ClassLoader.getSystemResource()用法及代码示例
- Java Class asSubclass()用法及代码示例
- Java Class getSuperClass()用法及代码示例
- Java Class isAnonymousClass()用法及代码示例
- Java Class isPrimitive()用法及代码示例
- Java Class newInstance()用法及代码示例
注:本文由纯净天空筛选整理自utkarsh_kumar大神的英文原创作品 Closures in Java with Examples。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。