IT TIP

Collectors.toMap () keyMapper — 더 간결한 표현?

itqueen 2020. 10. 22. 23:50
반응형

Collectors.toMap () keyMapper — 더 간결한 표현?


다음 Collectors.toMap()호출 에서 "keyMapper"함수 매개 변수에 대해보다 간결한 표현식을 작성하려고합니다 .

List<Person> roster = ...;

Map<String, Person> map = 
    roster
        .stream()
        .collect(
            Collectors.toMap(
                new Function<Person, String>() { 
                    public String apply(Person p) { return p.getLast(); } 
                },
                Function.<Person>identity()));

람다 식을 사용하여 인라인 할 수 있어야 할 것 같지만 컴파일되는 식을 찾을 수 없습니다. (나는 람다를 처음 접했기 때문에 그리 놀라운 일이 아닙니다.)

감사.

-> 업데이트 :

수락 된 답변에서 언급했듯이

Person::getLast

내가 찾던 것이었고 시도한 것입니다. 그러나 Eclipse 4.3의 BETA_8 nightly 빌드가 문제였습니다. 명령 줄에서 컴파일하면 (게시하기 전에 수행해야했던) 작동했습니다. 이제 eclipse.org에 버그를 신고 할 시간입니다.

감사.


람다를 사용할 수 있습니다.

Collectors.toMap(p -> p.getLast(), Function.identity())

또는 더 간결하게 다음을 사용하여 메서드 참조사용할 수 있습니다 ::.

Collectors.toMap(Person::getLast, Function.identity())

대신에 Function.identity동등한 람다를 사용할 수 있습니다.

Collectors.toMap(Person::getLast, p -> p)

Netbeans를 사용하는 경우 익명 클래스를 람다로 대체 할 수있을 때마다 힌트를 받아야합니다.


List<Person> roster = ...;

Map<String, Person> map = 
    roster
        .stream()
        .collect(
            Collectors.toMap(p -> p.getLast(), p -> p)
        );

그것은 번역이 될 것이지만 나는 이것을 실행하지 않았거나 API를 사용하지 않았습니다. Function.identity () 대신 p-> p로 대체 할 수 있습니다. 그리고 정적으로 toMap (...) 가져 오기


동일한 키 충돌의 경우에도 선택적 병합 기능을 사용할 수 있습니다. 예를 들어 두 명 이상의 사람이 동일한 getLast () 값을 가진 경우 값을 병합하는 방법을 지정할 수 있습니다. 이렇게하지 않으면 IllegalStateException이 발생할 수 있습니다. 이를 달성하는 예는 다음과 같습니다.

Map<String, Person> map = 
roster
    .stream()
    .collect(
        Collectors.toMap(p -> p.getLast(),
                         p -> p,
                         (person1, person2) -> person1+";"+person2)
    );

참고 URL : https://stackoverflow.com/questions/19254884/collectors-tomap-keymapper-more-succinct-expression

반응형