我如何使用
Java Streams执行以下操作?
假设我有以下类:
class Foo { Bar b; } class Bar { String id; String date; }
我有一个列表< Foo>并且我想将其转换为Map< Foo.b.id,Map< Foo.b.date,Foo> ;. I.e:首先由Foo.b.id组合,然后由Foo.b.date组合. 我正在努力使用以下两步法,但第二个甚至不编译:
Map<String,List<Foo>> groupById = myList .stream() .collect( Collectors.groupingBy( foo -> foo.getBar().getId() ) ); Map<String,Map<String,Foo>> output = groupById.entrySet() .stream() .map( entry -> entry.getKey(),entry -> entry.getValue() .stream() .collect( Collectors.groupingBy( bar -> bar.getDate() ) ) );
提前致谢.
解决方法
您可以一次分组您的数据,假设只有不同的Foo:
Map<String,Foo>> map = list.stream() .collect(Collectors.groupingBy(f -> f.b.id,Collectors.toMap(f -> f.b.date,Function.identity())));
使用静态导入保存一些字符:
Map<String,Foo>> map = list.stream() .collect(groupingBy(f -> f.b.id,toMap(f -> f.b.date,identity())));