使用Java Streams按Collection属性进行分组

我有一个包含字符串集合的对象,比方说一个人说的语言。

public class Person {
   private String name;
   private int age;
   private List<String> languagesSpoken;

   // ...
}

现在,创建像这样的一些实例......

Person p1 = new Person("Bob", 21, Arrays.asList("English", "French", "German"));
Person p2 = new Person("Alice", 33, Arrays.asList("English", "Chinese", "Spanish"));
Person p3 = new Person("Joe", 43, Arrays.asList("English", "Dutch", "Spanish", "German"));

//put them in list
List<Person> people = Arrays.asList(p1,p2,p3);

我想要的是Map <String,List <Person >>,用于列出说该语言的人的每种语言:

["English" -> [p1, p2, p3],
 "German"  -> [p1, p3],
 etc. ]
当然,这可以通过命令式方式轻松编程,但如何使用Java Streams实现功能? 我尝试过像people.stream.collect(groupingBy(Person :: getLanguagesSpoken))这样的东西但当然给了我一个Map <List <String>,List <Person >>。 我能找到的所有例子都是使用groupingBy on Primitives或Strings。


 
java
java-8
java-stream
0s