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。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。