import java.util.*; import static java.util.stream.Collectors.groupingBy; import static java.util.stream.Collectors.mapping; import static java.util.stream.Collectors.toList; class Test { private static void run() { List<R> list = Arrays.asList(new R()); System.out.println( list.stream() .collect(groupingBy(r -> r.get(String.class), mapping(r -> r.get(String.class),toList()) )) ); } static class R { <T> T get(Class<T> clazz) { if (clazz == String.class) return (T) "string"; throw new IllegalArgumentException(); } } }