Java 8 streams, convert List of object to Map<String, Set<String>>

Bik*_*wal 3 java java-8 java-stream

I have already gone through few examples and those did not work for me.

Here is what I am trying to do:

I have a List<SomeClass> of the following class:

class SomeClass {
  String rid;
  String name;
  ...
}
Run Code Online (Sandbox Code Playgroud)

The values in my List look like this:

SomeClass(1,"apple")
SomeClass(1,"banana")
SomeClass(1,"orange")
SomeClass(2,"papaya")
SomeClass(2,"peaches")
SomeClass(3,"melons")
Run Code Online (Sandbox Code Playgroud)

I want to convert the above List into a Map<String, Set<String>>, where key is rid and value is Set of name field.

To solve this using Java Streams I am using groupingBy and I could come to below solution:

someClassList
            .stream()
            .map(SomeClass::getName)
            .collect(
                  Collectors.groupingBy(
                      SomeClass::getRid, Collectors.toSet()));
Run Code Online (Sandbox Code Playgroud)

But this gives me compilation error. How do I solve this and what is the problem with my approach?

Era*_*ran 6

When you call .map(SomeClass::getName) on your Stream<SomeClass>, you get a Stream<String>. You can't execute collect(Collectors.groupingBy(SomeClass::getRid,...)) on a Stream<String> (you can only execute it on a Stream<SomeClass>). Therefore your map step is wrong.

You need to pass the Collector returned by Collectors.mapping() to Collectors.groupingBy() in order to map the SomeClass instances to Strings after they are grouped by getRid.

Map<String, Set<String>> map =
    someClassList.stream()
                 .collect(Collectors.groupingBy(SomeClass::getRid, 
                                                Collectors.mapping(SomeClass::getName,
                                                                   Collectors.toSet())));
Run Code Online (Sandbox Code Playgroud)