문제

누군가 설명할 수 있?I 기본 개념을 이해하고 그들을 뒤로 하지만 난 종종 그들을 볼 같은 의미로 사용되고 저는 혼동된다.

그리고 지금 우리가 여기에,그들은 어떻게 다를 일정한 기능이?

도움이 되었습니까?

해결책

람다 단지 익명 함수입니다. 이름이없는 함수입니다. 체계와 같은 일부 언어에서는 명명 된 기능과 동일합니다. 실제로, 함수 정의는 람다를 내부적으로 변수에 바인딩하는 것으로 다시 작성됩니다. Python과 같은 다른 언어에서는 그들 사이에 일부 (불필요한) 차이가 있지만 그렇지 않으면 같은 방식으로 행동합니다.

폐쇄 어떤 함수입니다 끝납니다 그만큼 환경 정의되었습니다. 이는 매개 변수 목록이 아닌 변수에 액세스 할 수 있음을 의미합니다. 예 :

def func(): return h
def anotherfunc(h):
   return func()

이로 인해 오류가 발생합니다 func 하지 않습니다 끝까지 환경 anotherfunc - h 정의되지 않았습니다. func 지구 환경에서만 닫힙니다. 이것은 작동합니다 :

def anotherfunc(h):
    def func(): return h
    return func()

여기 때문에 func 정의됩니다 anotherfunc, 그리고 python 2.3에서 거의 클로저가 맞습니다 (돌연변이가 여전히 작동하지 않음) 끝납니다 anotherfunc의 환경과 그 안에 변수에 액세스 할 수 있습니다. Python 3.1+에서는 사용될 때도 돌연변이도 작동합니다 그만큼 nonlocal 예어.

또 다른 중요한 요점 - func 계속해서 끝날 것입니다 anotherfunc더 이상 평가되지 않더라도 환경 anotherfunc. 이 코드도 작동합니다.

def anotherfunc(h):
    def func(): return h
    return func

print anotherfunc(10)()

이것은 10을 인쇄합니다.

알다시피, 이것은 아무 관련이 없습니다. 람다S- 두 가지 다른 개념입니다.

다른 팁

이 stackoverflow 질문에 대한 답변에서도 람다와 폐쇄에 대한 많은 혼란이 있습니다. 특정 프로그래밍 언어 나 다른 단서가없는 프로그래머로 연습에서 폐쇄에 대해 배운 무작위 프로그래머에게 요청하는 대신 원천 (모든 것이 시작된 곳). 그리고 람다와 폐쇄가 시작되기 때문에 람다 미적분학 첫 번째 전자 컴퓨터가 존재하기 전에 30 년대에 Alonzo Church에 의해 발명 된 것은 이것이 원천 나는 이야기하고있다.

람다 미적분학은 세계에서 가장 간단한 프로그래밍 언어입니다. 당신이 할 수있는 유일한 일 : ►

  • 응용 프로그램 : 하나의 표현식을 다른 표현식에 적용합니다 f x.
    (그것을 a로 생각하십시오 기능 호출, 어디 f 함수입니다 x 유일한 매개 변수)
  • 추상화 : 표현식에서 발생하는 기호를 바인딩 하여이 기호는 단지 "슬롯"이라는 점을 표시합니다. 그리스어 편지를 선물하여 이루어집니다 λ (Lambda), 그런 다음 상징적 이름 (예 : x), 그런 다음 점 . 표현 전에. 그런 다음 표현식을 a로 변환합니다 기능 하나를 기대합니다 매개 변수.
    예를 들어: λx.x+2 표현을 취합니다 x+2 상징을 알려줍니다 x 이 표현에는 a 바운드 변수 - 매개 변수로 제공하는 값으로 대체 할 수 있습니다.
    이 방식으로 정의 된 기능은 다음과 같습니다 익명의 - 이름이 없으므로 아직 참조 할 수는 없지만 즉시 전화하십시오 다음과 같이 기다리는 매개 변수를 제공함으로써 다음과 같이 기다리고 있습니다. (λx.x+2) 7. 그런 다음 표현식 (이 경우 문자 그대로 값) 7 대체됩니다 x 하위 표현에서 x+2 적용된 람다의 그래서 당신은 얻을 수 있습니다 7+2, 그런 다음 감소합니다 9 일반적인 산술 규칙에 따라.

그래서 우리는 미스터리 중 하나를 해결했습니다.
람다 입니다 익명 기능 위의 예에서 λx.x+2.


다른 프로그래밍 언어에서는 기능적 추상화 (LAMBDA)의 구문이 다를 수 있습니다. 예를 들어, JavaScript에서는 다음과 같습니다.

function(x) { return x+2; }

그리고 즉시 다음과 같은 일부 매개 변수에 적용 할 수 있습니다.

(function(x) { return x+2; })(7)

또는이 익명 함수 (Lambda)를 일부 변수에 저장할 수 있습니다.

var f = function(x) { return x+2; }

효과적으로 이름을 부여합니다 f, 당신이 그것을 참조하고 여러 번 나중에 호출 할 수있게합니다.

alert(  f(7) + f(10)  );   // should print 21 in the message box

그러나 당신은 그것을 지명 할 필요가 없었습니다. 즉시 호출 할 수 있습니다.

alert(  function(x) { return x+2; } (7)  );  // should print 9 in the message box

LISP에서는 람다가 다음과 같이 만들어집니다.

(lambda (x) (+ x 2))

그리고 당신은 그러한 람다를 매개 변수에 즉시 적용하여 다음 람다를 호출 할 수 있습니다.

(  (lambda (x) (+ x 2))  7  )


좋아, 이제 다른 미스터리를 해결할 시간입니다. 폐쇄. 그렇게하기 위해 기호 (변수) 람다 표현.

내가 말했듯이 Lambda 추상화가하는 일은 제본 하위 표현의 기호로 대체 가능성이됩니다. 매개 변수. 그러한 상징이 호출됩니다 경계. 그러나 표현에 다른 기호가 있다면 어떨까요? 예를 들어: λx.x/y+2. 이 표현에서 상징 x 람다 추상화에 묶여 있습니다 λx. 앞서. 그러나 다른 상징은 y, 묶이지 않습니다 - 그것은입니다 무료. 우리는 그것이 무엇인지, 어디에서 왔는지 알지 못하므로 무엇이 무엇인지 모릅니다. 수단 그리고 뭐 그것은 우리가 무엇을 알아낼 때까지 그 표현을 평가할 수 없습니다. y 수단.

사실, 다른 두 기호와 마찬가지로 2 그리고 +. 우리는이 두 가지 상징에 너무 익숙해 져서 컴퓨터가 알지 못한다는 것을 잊어 버리며, 예를 들어 도서관이나 언어 자체에서 어딘가에 정의함으로써 의미하는 바를 말해야합니다.

당신은 생각할 수 있습니다 무료 다른 곳에서 표현 외부, "주변 상황"에서 정의 된 기호. 환경. 환경은이 표현이 (Qui-Gon Jinn이 말했듯이, "항상 더 큰 물고기가 있습니다") 또는 일부 도서관 자체 (A)의 일부라는 더 큰 표현 일 수 있습니다. 원어).

이를 통해 Lambda 표현을 두 가지 범주로 나눌 수 있습니다.

  • 닫힌 표현 :이 표현에서 발생하는 모든 기호는 다음과 같습니다. 경계 일부 람다 추상화에 의해. 다시 말해, 그들은입니다 자기 포함; 그들은 주변 상황을 평가할 필요가 없습니다. 그들은 또한 호출됩니다 콤비네이터.
  • 열린 표현 :이 표현의 일부 기호는 경계 - 즉, 그 안에서 발생하는 일부 기호는 무료 그리고 그들은 외부 정보가 필요하므로 이러한 기호의 정의를 제공 할 때까지 평가할 수 없습니다.

당신은 닫을 수 있습니다 열려 있는 공급함으로써 람다 표현 환경,이 모든 자유 기호를 일부 값 (숫자, 문자열, 익명 함수 일 수 있습니다.

그리고 여기에 온다 폐쇄 부분:
그만큼 폐쇄 a 람다 표현 이 특정 기호 집합은 외부 컨텍스트 (환경)에 정의 된 것입니다. 무료 기호 이 표현에서 더 이상 무관심하게 만듭니다. 그것은 변합니다 열려 있는 여전히 "정의되지 않은"자유 기호를 포함하는 Lambda Expression은 닫은 하나는 더 이상 무료 기호가 없습니다.

예를 들어, 다음 람다 표현이있는 경우 : λx.x/y+2, 상징물 x 기호는 묶여 있습니다 y 그러므로 표현은 자유 롭습니다 open 그리고 당신이 무엇을 말하지 않으면 평가할 수 없습니다 y 의미 (그리고 동일합니다 + 그리고 2, 또한 무료입니다). 그러나 당신도 당신도 있다고 가정 해보십시오 환경 이와 같이:

{  y: 3,
+: [built-in addition],
2: [built-in number],
q: 42,
w: 5  }

이것 환경 Lambda 표현식의 모든 "정의되지 않은"(무료) 기호에 대한 정의 (y, +, 2) 및 몇 가지 추가 기호 (q, w). 우리가 정의 해야하는 기호는이 환경의 하위 집합입니다.

{  y: 3,
+: [built-in addition],
2: [built-in number]  }

그리고 이것은 정확히입니다 폐쇄 우리의 람다 표현 :>

다시 말해, 그것은 닫힙니다 열린 람다 표현. 이것은 이름이있는 곳입니다 폐쇄 처음부터 나왔는데 이것이이 스레드에서 많은 사람들의 답변이 정확하지 않은 이유입니다.


그래서 왜 그들은 착각합니까? 왜 그렇게 많은 사람들이 폐쇄가 메모리의 일부 데이터 구조 또는 그들이 사용하는 언어의 일부 기능이라고 말합니까, 아니면 왜 폐쇄를 람다와 혼동 하는가? :피

글쎄, Sun/Oracle, Microsoft, Google 등의 기업 마켓 이들은 비난을받을 것입니다. 왜냐하면 그들이 언어로 이러한 구성을 불렀기 때문입니다 (Java, C#, Go 등). 그들은 종종 람다스가되어야 할 "폐쇄"라고 부릅니다. 또는 어휘 스코핑을 구현하는 데 사용한 특정 기술, 즉 함수가 정의 시점에 외부 범위로 정의 된 변수에 액세스 할 수 있다는 사실을 "클로저"라고 부릅니다. 그들은 종종이 기능이 이러한 변수를 "동봉"한다고 말합니다. 즉, 외부 기능이 실행 된 후에는 이들 변수를 일부 데이터 구조로 포착하여 파괴되지 않도록 절약합니다. 그러나 이것은 단지 만들어졌습니다 포스트 사실 모든 언어 공급 업체가 자체 용어를 사용하기 때문에 "민속 어원"과 마케팅은 더 혼란스럽게 만듭니다.

그리고 그들이 말하는 것에 항상 약간의 진실이 있다는 사실 때문에 더 나쁘다. 이것은 당신이 그것을 거짓으로 쉽게 무시할 수 없다는 사실 : P 설명하자.

Lambdas를 일류 시민으로 사용하는 언어를 구현하려면 주변 컨텍스트에서 정의 된 기호를 사용할 수 있어야합니다 (즉, Lambdas에서 무료 변수를 사용하기 위해). 그리고이 기호는 주변 기능이 돌아올 때에도 있어야합니다. 문제는이 기호가 함수의 일부 로컬 저장 (일반적으로 통화 스택에)에 바인딩되며 함수가 반환 될 때 더 이상 존재하지 않습니다. 따라서 Lambda가 기대하는 방식으로 작동하려면 외부 컨텍스트에서 이러한 모든 자유 변수를 "캡처"하고 외부 상황이 사라질 때에도 나중에 저장해야합니다. 즉, 당신은 그것을 찾아야합니다 폐쇄 Lambda (이 모든 외부 변수) 중에서 다른 곳에 보관하거나 (사본을 만들거나, 스택의 다른 곳에서 선불 공간을 준비함으로써) 보관하십시오. 이 목표를 달성하기 위해 사용하는 실제 방법은 언어의 "구현 세부 사항"입니다. 여기서 중요한 것은 폐쇄, 그것은 세트입니다 자유 변수 ~로부터 환경 어딘가에 저장 해야하는 람다의.

사람들이 언어 구현에 사용하는 실제 데이터 구조를 호출하여 "클로저"자체로 폐쇄를 구현하는 데 시간이 오래 걸리지 않았습니다. 구조는 일반적으로 다음과 같습니다.

Closure {
   [pointer to the lambda function's machine code],
   [pointer to the lambda function's environment]
}

이러한 데이터 구조는 다른 함수의 매개 변수로 전달되고, 함수에서 반환되고, 변수에 저장되어 Lambdas를 표현하고, 해당 맥락에서 실행될 기계 코드뿐만 아니라 동요 환경에 액세스 할 수 있도록합니다. 그러나 그것은 단지 (많은 것 중 하나)입니다. 구현하다 폐쇄 그만큼 폐쇄 자체.

위에서 설명한 것처럼 Lambda 표현의 폐쇄는 해당 Lambda 표현에 포함 된 자유 변수에 효과적으로 값을 제공하는 환경에서 정의의 하위 집합입니다. 폐쇄 표현식 (회전 열려 있는 아직 평가할 수없는 람다 표현은 닫은 람다 표현식은 현재 포함 된 모든 기호가 정의되기 때문에 평가 될 수 있습니다).

다른 것은 단지 이러한 개념의 실제 뿌리를 알지 못하는 프로그래머와 언어 공급 업체의 "화물 컬트"와 "Voo-Doo 마술"일뿐입니다.

나는 그것이 당신의 질문에 답하기를 바랍니다. 그러나 후속 질문이 있다면 의견에 자유롭게 물어보십시오. 더 잘 설명하려고 노력할 것입니다.

대부분의 사람들이 생각할 때 기능, 그들은 생각합니다 이름이 지정된 기능:

function foo() { return "This string is returned from the 'foo' function"; }

물론 이름으로 불립니다.

foo(); //returns the string above

와 함께 람다 표현, 당신은 가질 수 있습니다 익명 기능:

 @foo = lambda() {return "This is returned from a function without a name";}

위의 예를 통해 다음에 할당 된 변수를 통해 Lambda를 호출 할 수 있습니다.

foo();

그러나 변수에 익명 함수를 할당하는 것보다 더 유용하지만 다른 기능을 수용/반환하는 기능, 즉 기능에서 또는 기능을 전달하는 것입니다. 이러한 많은 경우, 함수 이름은 불필요합니다.

function filter(list, predicate) 
 { @filteredList = [];
   for-each (@x in list) if (predicate(x)) filteredList.add(x);
   return filteredList;
 }

//filter for even numbers
filter([0,1,2,3,4,5,6], lambda(x) {return (x mod 2 == 0)}); 

폐쇄 명명 된 기능이거나 익명의 함수 일 수 있지만 함수가 정의되는 범위에서 변수를 "닫을 때"로 알려져 있습니다. 즉, 폐쇄는 여전히 클로저 자체에 사용되는 외부 변수를 가진 환경을 참조합니다. . 다음은 명명 된 폐쇄입니다.

@x = 0;

function incrementX() { x = x + 1;}

incrementX(); // x now equals 1

그다지 좋아 보이지는 않지만 이것이 모두 다른 기능에 있었고 당신이 통과했다면 incrementX 외부 기능에?

function foo()
 { @x = 0;

   function incrementX() 
    { x = x + 1;
      return x;
    }

   return incrementX;
 }

@y = foo(); // y = closure of incrementX over foo.x
y(); //returns 1 (y.x == 0 + 1)
y(); //returns 2 (y.x == 1 + 1)

기능적 프로그래밍에서 상태가 많은 객체를 얻는 방법입니다. "excrementx"이름 지정이 필요하지 않으므로이 경우 람다를 사용할 수 있습니다.

function foo()
 { @x = 0;

   return lambda() 
           { x = x + 1;
             return x;
           };
 }

모든 폐쇄가 람다가되는 것은 아니며 모든 람다가 폐쇄는 아닙니다. 둘 다 기능이지만 반드시 우리가 아는 데 익숙한 방식은 아닙니다.

람다는 본질적으로 함수를 선언하는 표준 방법보다는 인라인으로 정의되는 함수입니다. 람다는 종종 물체로 통과 할 수 있습니다.

클로저는 본체 외부의 필드를 참조하여 주변 상태를 둘러싸는 기능입니다. 밀폐 된 상태는 폐쇄의 호출에 남아 있습니다.

객체 지향 언어에서, 클로저는 일반적으로 객체를 통해 제공됩니다. 그러나 일부 OO 언어 (예 : C#)는 순수하게 제공되는 클로저 정의에 더 가깝게 특수 기능을 구현합니다. 기능적 언어 상태를 둘러싸고있는 물체가없는 (LISP와 같은).

흥미로운 점은 C#에 Lambdas와 Closure를 도입하면 기능적 프로그래밍이 주류 사용에 더 가깝습니다.

Lambda는 언어 구성, 즉 단순히 익명 기능을위한 구문입니다. 폐쇄는 해당 문제에 대한 일류 기능을 구현하는 기술입니다.

더 정확하게는 폐쇄는 a 일류 기능 런타임에 해당 코드에 사용 된 모든 비 국소 변수에 대해 "코드"쌍과 환경 "폐쇄"로 표시됩니다. 이런 식으로, 이러한 변수는 출발 한 외부 스코프가 이미 종료 된 경우에도 여전히 액세스 할 수 있습니다.

불행히도, 기능을 일류 값으로 지원하지 않거나 절름발이 형태로만 지원하는 많은 언어가 있습니다. 따라서 사람들은 종종 "클로저"라는 용어를 사용하여 "실제"를 구별합니다.

프로그래밍 언어의 관점에서 볼 때, 그들은 완전히 다른 두 가지입니다.

기본적으로 튜링 완전한 언어의 경우, 우리는 매우 제한된 요소, 예를 들어 추상화, 응용 프로그램 및 감소 만 있으면됩니다. 추상화 및 응용 프로그램은 Lamdba 발현을 구축 할 수있는 방법을 제공하고 Lambda 발현의 의미를 Dertermine을 제공합니다.

Lambda는 계산 프로세스를 추상화 할 수있는 방법을 제공합니다. 예를 들어, 두 숫자의 합을 계산하기 위해 두 매개 변수 x를 취하고 x+y를 반환하는 프로세스를 추상화 할 수 있습니다. 체계에서는 다음과 같이 쓸 수 있습니다

(lambda (x y) (+ x y))

매개 변수의 이름을 바꿀 수 있지만 완료 한 작업은 변경되지 않습니다. 거의 모든 프로그래밍 언어에서 Lambda Expression에 이름이 이름을 부여 할 수 있습니다. 그러나 큰 차이는 없으며 개념적으로 구문 설탕으로 간주 될 수 있습니다.

자, 이제 이것이 어떻게 구현 될 수 있는지 상상해보십시오. 람다 표현을 표현에 적용 할 때마다

((lambda (x y) (+ x y)) 2 3)

우리는 단순히 매개 변수를 평가할 표현으로 대체 할 수 있습니다. 이 모델은 이미 매우 강력합니다. 그러나이 모델은 기호의 값을 변경할 수 없습니다. 예를 들어 상태 변경을 모방 할 수 없습니다. 따라서 우리는 더 복잡한 모델이 필요합니다. 짧게 만들기 위해 Lambda 표현의 의미를 계산할 때마다 상징 쌍과 해당 값을 환경 (또는 표)에 넣습니다. 그런 다음 나머지 (+ xy)는 테이블의 해당 기호를 찾아 평가합니다. 이제 환경에서 직접 작동 할 프리미티브를 제공한다면 상태 변경 사항을 모델링 할 수 있습니다!

이 배경 으로이 기능을 확인하십시오.

(lambda (x y) (+ x y z))

우리는 Lambda Expression을 평가할 때 XY가 새 테이블에 묶여 있음을 알고 있습니다. 그러나 우리는 어떻게 그리고 어디서 z를 볼 수 있습니까? 실제로 z를 자유 변수라고합니다. z를 포함하는 외부 환경이 있어야합니다. 그렇지 않으면 표현의 의미는 x와 y의 결합만으로 결정될 수 없습니다. 이것을 명확하게하기 위해, 당신은 계획에서 다음과 같이 무언가를 쓸 수 있습니다.

((lambda (z) (lambda (x y) (+ x y z))) 1)

따라서 z는 외부 테이블에서 1에 결합됩니다. 우리는 여전히 두 매개 변수를 받아들이는 함수를 얻지 만 그 의미는 외부 환경에 따라 다릅니다. 다시 말해, 외부 환경은 자유 변수에서 닫힙니다. Set!의 도움으로 기능을 상태로 만들 수 있습니다. 즉, 수학의 의미에서 기능이 아닙니다. 반환 내용은 입력뿐만 아니라 Z에도 달려 있습니다.

이것은 당신이 이미 잘 알고있는 것입니다. 물체의 방법은 거의 항상 객체 상태에 의존합니다. 그렇기 때문에 어떤 사람들은 "폐쇄는 가난한 사람의 대상"이라고 말합니다. 그러나 우리는 일류 기능을 정말 좋아하기 때문에 대상을 가난한 사람의 폐쇄로 간주 할 수도 있습니다.

나는 체계를 사용하여 그 계획이 실질적인 폐쇄를 가진 가장 초기 언어 중 하나이기 때문에 아이디어를 설명합니다. 여기의 모든 자료는 SICP 3 장에서 훨씬 더 잘 제시됩니다.

요약하면, Lambda와 Closure는 실제로 다른 개념입니다. 람다는 기능입니다. 폐쇄는 한 쌍의 람다와 람다를 닫는 해당 환경입니다.

개념은 위에서 설명한 것과 동일하지만 PHP 배경에서 나온 경우 PHP 코드를 사용하여 설명합니다.

$input = array(1, 2, 3, 4, 5);
$output = array_filter($input, function ($v) { return $v > 2; });

함수 ($ v) {return $ v> 2; }는 Lambda 함수 정의입니다. 변수에 저장할 수도 있으므로 재사용 할 수 있습니다.

$max = function ($v) { return $v > 2; };

$input = array(1, 2, 3, 4, 5);
$output = array_filter($input, $max);

이제 필터링 어레이에서 허용되는 최대 수를 변경하려면 어떻게해야합니까? 다른 람다 함수를 작성하거나 폐쇄를 만들어야합니다 (PHP 5.3) :

$max_comp = function ($max) {
  return function ($v) use ($max) { return $v > $max; };
};

$input = array(1, 2, 3, 4, 5);
$output = array_filter($input, $max_comp(2));

클로저는 자체 환경에서 평가되는 함수이며, 기능이 호출 될 때 액세스 할 수있는 하나 이상의 바인딩 변수가 있습니다. 그들은 기능적 프로그래밍 세계에서 왔으며, 여기에는 많은 개념이 있습니다. 폐쇄는 람다 기능과 같지만 폐쇄가 정의되는 외부 환경과 변수와 상호 작용할 수 있다는 점에서 더 똑똑합니다.

PHP 폐쇄의 간단한 예는 다음과 같습니다.

$string = "Hello World!";
$closure = function() use ($string) { echo $string; };

$closure();

이 기사에서 잘 설명되었습니다.

이 질문은 오래되었고 많은 대답을 얻었습니다. 이제 비공식 폐쇄 프로젝트 인 Java 8과 공식 Lambda와 함께 질문을 부활시킵니다.

Java 컨텍스트의 답변 (비아 람다와 폐쇄 - 차이점은 무엇입니까?):

"폐쇄는 각 자유 변수를 값에 묶는 환경과 짝을 이루는 람다 표현입니다. Java에서는 람다 표현식이 폐쇄를 통해 구현 될 것이므로 두 용어는 커뮤니티에서 상호 교환 적으로 사용됩니다."

간단히 말해서, 폐쇄는 범위에 대한 속임수이며 Lambda는 익명의 기능입니다. 우리는 Lambda와의 폐쇄를 더 우아하게 깨달을 수 있으며 Lambda는 종종 더 높은 기능으로 전달되는 매개 변수로 사용됩니다.

람다 식은 익명의 기능입니다.일반 java,예를 들어,당신은 그것을 쓸 수 있으면 다음과 같다:

Function<Person, Job> mapPersonToJob = new Function<Person, Job>() {
    public Job apply(Person person) {
        Job job = new Job(person.getPersonId(), person.getJobDescription());
        return job;
    }
};

클래스 기능이 내장 자바 코드입니다.지금할 수 있는 통화 mapPersonToJob.apply(person) 어딘가에 그것을 사용합니다.그게 단지 하나의 예입니다.잖아 람다 전에 있었다는 구문을니다.람다 짧은 잘합니다.

폐:

람다가 폐쇄 할 때 그것은에 액세스할 수 있는 변수를 외부의 이 범위가 있습니다.내 생각을 말할 수 있는 마술,마술할 수 있습니다 환경을 만들었고 있는 변수를 사용하여 외부의 그것의 범위(외부 범위가 있습니다.그래서 명확하게하려면,마감을 의미한 람다에 액세스할 수 있습 그 외부 범위가 있습니다.

코 틀린,람다 항상 액세스할 수 있는 폐쇄(이 변수에 있는 그것의 외부 범위)

함수가 외부 변수를 사용하는지 또는 작동을 수행할지 여부에 따라 다릅니다.

외부 변수 - 함수의 범위 밖에서 정의 된 변수.

  • Lambda 표현입니다 무국적 매개 변수, 내부 변수 또는 작업을 수행하기위한 상수에 따라 다릅니다.

    Function<Integer,Integer> lambda = t -> {
        int n = 2
        return t * n 
    }
    
  • 폐쇄 상태를 유지하십시오 외부 변수 (즉, 기능 본문의 범위 외부에서 정의 된 변수)를 사용하기 때문에 작업을 수행하기위한 매개 변수 및 상수를 사용하기 때문입니다.

    int n = 2
    
    Function<Integer,Integer> closure = t -> {
        return t * n 
    }
    

Java가 폐쇄를 생성 할 때, 변수 n을 함수와 함께 유지하여 다른 함수로 전달되거나 어디에서나 사용될 때 참조 할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top