JEP 323: Local-Variable Syntax for Lambda Parameters

JEP 323: Local-Variable Syntax for Lambda Parameters

암시 적으로 형식화 된 람다 식의 형식 매개 변수를 선언 할 때 var를 허용

목표

  • 암시 적으로 형식화 된 람다 식의 형식적 매개 변수 선언 구문을 로컬 변수 선언 구문과 맞춥니다

비목표

  • 변수 선언의 다른 종류 (예 : 메소드의 형식 매개 변수)의 구문을 로컬 변수 선언의 구문과 맞춥니다.
1
2
3
4
5
6
람다 식의 형식 매개 변수는 선언 된 형식 또는 유추 된 형식을 가질 수 있습니다.
이러한 스타일은 혼합 될 수 없습니다.
람다 식에서 매개 변수의 일부 유형을 선언 할 수는 있지만 다른 매개 변수의 유추를 유추 할 수는 없습니다. 선언 된 유형이있는 매개 변수 만 수정자를 가질 수 있습니다.

(x, y) -> x.process(y)

Java SE 10은 지역 변수에 대해 암묵적인 타이핑을 가능하게합니다

1
2
3
4
5

var x = new Foo();
for (var x : xs) { ... }
try (var x = ...) { ... } catch ...

지역 변수의 균일 성을 위해 암시 적으로 형식화 된 람다 식의 형식 매개 변수에 ‘var’을 허용합니다

1
2
3

(var x, var y) -> x.process(y)

균일 성의 한 가지 이점은 수정 자, 특히 주석이 간결함을 잃지 않고 지역 변수 및 람다 형식에 적용될 수 있다는 것입니다.

1
2
3
4

@Nonnull var x = new Foo();
(@Nonnull var x, @Nullable var y) -> x.process(y)

암시 적으로 형식화 된 람다 식의 형식 매개 변수의 경우 예약 된 형식 이름 var을 사용 하도록 허용하십시오 .

1
2
3

(var x, var y) -> x.process(y)

아래 처럼 암시 적으로 형식화 된 람다 식은 var모든 형식 매개 변수에 대해 또는 모두에 대해 사용해야 합니다.
또한 var암시 적으로 형식화 된 람다 식의 형식 매개 변수에 대해서만 허용됩니다.
명시 적 형식의 람다 식은 모든 형식 매개 변수에 대해 매니페스트 형식을 계속 지정 하므로 일부 형식 매개 변수의 경우 매니페스트 형식을 사용할 수 없습니다

1
2
(x, y) -> x.process(y)

아래의 예제는 잘못 된 것입니다.

1
2
3
(var x, y) -> x.process(y)   
(var x, int y) -> x.process(y)

이론 상으로는 위의 마지막 줄과 같은 람다 표현식을 사용하는 것이 가능합니다.이 표현식은 반자동 형식 (또는 사용자의 관점에 따라 반 암시 적 형식)입니다.
그러나 형식 유추 및 과부하 해결에 깊이 영향을주기 때문에이 JEP의 범위를 벗어납니다.
이것은 람다식이 모든 매니페스트 매개 변수 유형을 지정해야하는지 또는 없음을 지정하는 제한을 유지하는 주된 이유입니다.
암시 적으로 형식화 된 람다 식의 매개 변수에 대해 유추 된 유 형 var이 사용 여부와 관계없이 동일하도록 적용하려고합니다 .
우리는 미래 JEP에서 부분 추론의 문제로 돌아갈 수 있습니다.
또한 속기 구문의 간결함을 손상시키지 않으므로 다음과 같은 표현을 허용하지 않습니다.

1
2
3

var x -> x.foo()

대안은 기존에 Java SE 8에서와 같이 암시 적으로 형식화 된 람다 식을 계속 선언합니다.

위험

이 JEP는 var암시 적으로 형식화 된 람다 식의 매개 변수 이름 앞에 추가 될 때 소스 비호 환성의 위험이 없습니다 . 매개 변수없이 var유추 된 유 형이 유추 된 유 형과 동일 하기 때문 입니다.

참조