단어 스트림을 사용하여 일부 작업을 수행하는 스트림 처리 코드가 있는데 단어를 키로 사용하고 단어 수가 출제 횟수가 Long
인 Map
으로 줄입니다. 코드의 간결함을 위해 의 Seq
클래스를 사용했으며, 여기에는 여러 가지 유용한 바로 가기 메서드가 포함되어 있습니다. 나는이처럼 작성하는 경우Java가이 코드를 typecheck 할 수없는 이유는 무엇입니까?
코드는 잘 컴파일 :
item.setWordIndex (
getWords (item) // returns a Seq<String>
.map (this::removePunctuation) // String -> String
.map (stemmer::stem) // String -> String
.groupBy(str -> str, Collectors.counting()));
그러나, 나는 함께 str -> str
람다를 교체하려고하면 더 자기 문서화 Function::identity
을, 나는 다음과 같은 오류를 얻을 :
(Map<Object,Long>)
유형
Function
이를 정의하지 않습니다
유형
MyClass
의 방법setWordIndex(Map<String,Long>)
는 인수 적용 할 수 없습니다 나는 (아마도 순진) 가정하는
왜 Function::identity
는 str -> str
다르게 어떤 행동 않습니다 여기에 적용직접 해당하는, 그리고 그것을 사용하는 경우 왜 컴파일러는 그것을 처리 할 수 있습니까?
(그리고 그래, 나는이 groupBy
작업에 이전 map
응용 프로그램을 이동하여 식별 기능을 제거 할 수 있습니다 알고 있어요,하지만 더 직접 응용 프로그램 논리를 다음과 때문에,이 같은 코드를 명확하게 찾을 수)
가능한 복제 [자바 8 람다, Function.identity() 또는 T-> t (https://stackoverflow.com/questions/28032827/java- 8-lambdas-function-identity-or-tt) – Kraylog
당신은'Function :: identity'보다는'Function.identity()'를 원합니다. –
@ NimrodArgov -이 질문은이 특정 경우에 'Function :: identity'가 작동하지 않는 이유보다 둘 다 적합한 경우에 어떤 것이 바람직한 지 묻습니다. – Jules