Java 8 lamdas, Function.identity() 또는 t->t
사용방법에 대한 질문이 있습니다.Function.identity()
방법.
다음 코드를 상상해 보십시오.
Arrays.asList("a", "b", "c")
.stream()
.map(Function.identity()) // <- This,
.map(str -> str) // <- is the same as this.
.collect(Collectors.toMap(
Function.identity(), // <-- And this,
str -> str)); // <-- is the same as this.
이 제품을 사용해야 할 이유가 있습니까?Function.identity()
대신str->str
(또는 그 반대).나는 두 번째 옵션이 더 읽기 쉽다고 생각한다(물론 취향의 문제라고 생각한다.하지만, 어떤 사람이 선호되어야 하는 "진짜" 이유가 있을까요?
현재의 JRE 실장 시점에서는Function.identity()
가 발생할 때마다 항상 같은 인스턴스를 반환합니다.identifier -> identifier
독자적인 인스턴스를 작성할 뿐만 아니라, 독자적인 실장 클래스도 갖게 됩니다.상세한 것에 대하여는, 여기를 참조해 주세요.
그 이유는 컴파일러가 그 람다 표현의 사소한 본문을 유지하는 합성 메서드를 생성하기 때문입니다.x->x
(등가)return identifier;
이 메서드를 호출하는 기능 인터페이스의 구현을 작성하도록 런타임에 지시합니다.따라서 런타임에는 다른 타깃 메서드만 표시되며 현재 구현에서는 메서드를 분석하여 특정 메서드가 동일한지 여부를 확인하지 않습니다.
그래서 사용하다Function.identity()
대신x -> x
기억을 조금 절약할 수는 있지만, 만약 당신이 정말로 그렇게 생각한다면, 그것이 당신의 결정을 이끌어내지는 못할 것이다.x -> x
보다 읽기 쉽다Function.identity()
.
또한 디버깅 정보를 이노블로 하여 컴파일 할 때 합성 메서드는 lambda 식을 보유하고 있는 소스 코드 행을 가리키는 행 디버깅 속성을 가지므로 특정 소스를 찾을 수 있습니다.Function
디버깅 중 인스턴스.반대로 에 의해 반환된 인스턴스가 발견되었을 경우Function.identity()
디버깅 작업 중에는 누가 해당 메서드를 호출하고 해당 인스턴스를 작업에 전달했는지 알 수 없습니다.
이 예에서는 다음 예와 큰 차이가 없습니다.str -> str
그리고.Function.identity()
내부적으로는 단순하기 때문에t->t
.
하지만 가끔 우리는 그것을 사용할 수 없다.Function.identity
사용할 수 없기 때문에Function
여기를 봐주세요.
List<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
이것은 잘 컴파일 될 것이다
int[] arrayOK = list.stream().mapToInt(i -> i).toArray();
하지만 만약 당신이 컴파일을 하려고 한다면
int[] arrayProblem = list.stream().mapToInt(Function.identity()).toArray();
이후 컴파일 오류가 발생합니다.mapToInt
예기하다ToIntFunction
는 와는 관련이 없습니다.Function
.또한.ToIntFunction
없다identity()
방법.
static <T> Function<T, T> identity() {
return t -> t;
}
그러니까, 구문적으로 맞는다면 안 돼요.
언급URL : https://stackoverflow.com/questions/28032827/java-8-lambdas-function-identity-or-t-t
'programing' 카테고리의 다른 글
이그제큐트 어라운드(Execute Around)라는 사자성어가 뭐죠? (0) | 2022.08.09 |
---|---|
다른 계산된 속성에서 getter를 호출하는 것은 테스트의 함수가 아닙니다. (0) | 2022.08.09 |
GCC/G++ 컴파일러에서 pedantic을 사용하는 목적은 무엇입니까? (0) | 2022.08.09 |
Vue.js 메서드에서 외부 JavaScript 개체를 사용하는 방법 (0) | 2022.08.09 |
Vue 데이터 바인딩을 사용하여 switch 문을 올바르게 표현하는 방법 (0) | 2022.08.09 |