>Java >java지도 시간 >람다 표현식 및 변수 캡처

람다 표현식 및 변수 캡처

Mary-Kate Olsen
Mary-Kate Olsen원래의
2025-01-12 06:29:45729검색

Expressões lambda e a captura de variáveis

포함된 범위의 변수에 대한 액세스

  • 람다 표현식은 다음 항목에 액세스할 수 있습니다.
  • 포함 클래스의 인스턴스 변수
  • 외부 클래스에 정의된 정적 변수
  • 외부 클래스의 호출 인스턴스를 참조하는 이 매개변수.

로컬 변수에 대한 액세스

  • 외부 범위 지역 변수를 사용하는 경우:
  • 지역 변수는 사실상 최종 변수여야 합니다.
  • 실질적으로 최종: 할당된 후에도 값이 변경되지 않는 변수입니다.
  • 최종이라고 명시적으로 선언할 필요는 없습니다.
  • 로컬 변수(람다 내부 또는 외부)를 수정하면 캡처가 무효화됩니다.

수정 제한
수정할 수 없습니다:

  • 람다 표현식 내에 캡처된 지역 변수.
  • 이 변수를 수정하면 사실상 최종 상태가 제거됩니다.

인스턴스 변수 수정
람다 표현식은 다음을 수행할 수 있습니다.

  • 호출 클래스의 인스턴스 변수를 사용하고 수정합니다.
  • 인스턴스 변수의 "최종" 상태에는 제한이 없습니다.

예: 외부 범위에서 지역 변수 캡처
코드:

interface MyFunc {
    int func(int n);
}

class VarCapture {
    public static void main(String args[]) {
        // Variável local que pode ser capturada
        int num = 10;

        MyFunc myLambda = (n) -> {
            // Uso correto da variável num
            int v = num + n;

            // A instrução abaixo é inválida porque tenta modificar num
            // num++;

            return v;
        };

        // Usando a expressão lambda
        System.out.println(myLambda.func(8)); // Exibe: 18

        // Modificar num aqui também causaria erro
        // num = 9;
    }
}

설명:

  • Num Capture:
    num은 초기 할당 후에 변경되지 않으므로 사실상 최종입니다.
    Lambda는 num에 액세스할 수 있지만 수정할 수는 없습니다.

  • 실행:
    myLambda.func(8)은 다음과 같은 이유로 18을 반환합니다.
    num(10)이 매개변수 n(8)에 추가되어 18이 생성됩니다.

  • 수정으로 인한 오류:
    num 또는 num = 9의 주석 처리를 제거하면 캡처가 무효화되어 컴파일 오류가 발생합니다.

  • 참고:
    중요: 인스턴스 또는 정적 변수는 람다 표현식 내에서 제한 없이 사용하고 수정할 수 있습니다.
    제한사항은 외부 범위 지역 변수에만 적용됩니다.

위 내용은 람다 표현식 및 변수 캡처의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.