programing

Java 8 lamdas, Function.identity() 또는 t->t

copysource 2022. 8. 9. 23:51
반응형

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()방법.

JDK 소스:

static <T> Function<T, T> identity() {
    return t -> t;
}

그러니까, 구문적으로 맞는다면 안 돼요.

언급URL : https://stackoverflow.com/questions/28032827/java-8-lambdas-function-identity-or-t-t

반응형