Function.identity()

2594 단어 JAVA 기술

Function.identity () 는 무엇입니까?

//  Stream Map
Stream stream = Stream.of("I", "love", "you", "too");
Map map = stream.collect(Collectors.toMap(Function.identity(), String::length));

Function은 인터페이스입니다. 그러면 Function.identity () 는 무슨 뜻입니까?설명은 다음과 같습니다.
Java 8에서는 인터페이스에 구체적인 방법을 추가할 수 있습니다.인터페이스의 구체적인 방법은 두 가지가 있는데 default 방법과 static 방법이다.identity () 는 바로 Function 인터페이스의 정적 방법이다.Function.identity () 는 출력과 입력이 같은 Lambda 표현식 대상을 되돌려줍니다. 이것은 t -> t 형식의 Lambda 표현식과 같습니다.
identity() 메서드 JDK 소스는 다음과 같습니다.
static  Function identity() {
    return t -> t;
}

Function.identity () 의 응용


다음 코드에서 Task::getTitle 하나의task가 필요하고 제목만 있는 키를 생성합니다.task -> task는 자신을 되돌려주는lambda 표현식으로, 상례에서task를 되돌려줍니다.
private static Map taskMap(List tasks) {
  return tasks.stream().collect(toMap(Task::getTitle, task -> task));
}
Function 인터페이스의 기본 방법identity을 사용하여 위의 코드 코드를 더욱 간결하고 명확하게 하고 개발자의 의도를 전달할 때 더욱 직접적으로 할 수 있으며 다음은 identity 함수를 사용하는 코드이다.
import static java.util.function.Function.identity;

private static Map taskMap(List tasks) {
  return tasks.stream().collect(toMap(Task::getTitle, identity()));
}

Function.identity() or t->t?

Arrays.asList("a", "b", "c")
          .stream()
          .map(Function.identity()) //  str)          //  str));        // 

위의 코드에서 왜 Function.identity() 대체str->str를 사용합니까?그것들은 어떤 차이가 있습니까?
위의 코드에서 str -> strFunction.identity() 는 별 차이가 없습니다. 왜냐하면 그들은 모두 t->t 이기 때문입니다.그러나 우리는 때때로 사용할 수 없다Function.identity. 아래의 예를 보자.
List 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 형식이지만 ToIntFunction 형식과 Function 관계가 없기 때문입니다.
 
작성자: zoyoto 링크:https://www.jianshu.com/p/cd694d2d8be5출처: 간서간서의 저작권은 작가의 소유이며, 어떠한 형식의 전재도 작가에게 연락하여 권한을 수여받고 출처를 밝히십시오.

좋은 웹페이지 즐겨찾기