2017-11-07 19 views
3

タイトルがあまり明確でない場合は謝罪してください。メソッド参照によって返されたオブジェクトのメソッドの呼び出し

私はEmployeeオブジェクトのリストを持っており、部門(Employeeオブジェクト内の文字列属性)がキーであり、従業員のセットが値であるようなマップを作成したいとします。

Map<String, Set<Employee>> employeesGroupedByDepartment = 
    employees.stream().collect(
     Collectors.groupingBy(
      Employee::getDepartment,Collectors.toCollection(HashSet::new) 
     ) 
    ); 

ここで、キー(部門)を大文字にするにはどうすればよいですか?メソッドリファレンスEmployee :: getDepartmentの出力を大文字にする方法が見つかりませんでした。

注:残念ながら、getDepartmentメソッドを変更して大文字で値を返すことも、新しいメソッド(getDepartmentInUpperCase)をEmployeeオブジェクトに追加することもできません。

答えて

6

それは通常のラムダを使用してそれを行うには、おそらく簡単です:

Map<String, Set<Employee>> employeesGroupedByDepartment = 
    employees.stream().collect(
     Collectors.groupingBy(
      e -> e.getDepartment().toUpperCase(), Collectors.toCollection(HashSet::new) 
     ) 
    ); 

あなたが本当に代わりにメソッド参照を使用したい場合は、チェーンのメソッド参照する方法は、(私は彼らと気にしないだろう)があります。おそらくのようなもの:

Map<String, Set<Employee>> employeesGroupedByDepartment = 
    employees.stream().collect(
     Collectors.groupingBy(
      ((Function<Employee,String>)Employee:getDepartment).andThen(String::toUpperCase)),Collectors.toCollection(HashSet::new) 
     ) 
    ); 
+1

...と方法によって、 'HashSet'、' Collectors.toCollection(HashSetの::新)は '' Collectors.toSet(と交換することができるべきセットのための要件が​​ない限り、 ) '。 – Holger