![](/img/trans.png)
[英]Convert Map<String, Object> to Map<String, Set<Object>> with filter and streams
[英]Java 8 streams, convert List of object to Map<String, Set<String>>
我已经经历了一些例子,那些对我不起作用。
这是我想要做的:
我有以下类的List<SomeClass>
:
class SomeClass {
String rid;
String name;
...
}
我List
的值如下所示:
SomeClass(1,"apple")
SomeClass(1,"banana")
SomeClass(1,"orange")
SomeClass(2,"papaya")
SomeClass(2,"peaches")
SomeClass(3,"melons")
我想将上面的List
转换为Map<String, Set<String>>
,其中key是rid
,value是Set
of name
字段。
要使用Java Streams
解决这个问题,我正在使用groupingBy
,我可以使用以下解决方案:
someClassList
.stream()
.map(SomeClass::getName)
.collect(
Collectors.groupingBy(
SomeClass::getRid, Collectors.toSet()));
但这给了我编译错误。 我如何解决这个问题以及我的方法有什么问题?
当你在Stream<SomeClass>
上调用.map(SomeClass::getName)
时,你会得到一个Stream<String>
。 您不能在Stream<String>
上执行collect(Collectors.groupingBy(SomeClass::getRid,...))
(您只能在Stream<SomeClass>
上执行它)。 因此,您的map
步骤是错误的。
你需要通过Collector
由归国Collectors.mapping()
来Collectors.groupingBy()
以在地图SomeClass
实例,以String
后 ,他们被分为小号getRid
。
Map<String, Set<String>> map =
someClassList.stream()
.collect(Collectors.groupingBy(SomeClass::getRid,
Collectors.mapping(SomeClass::getName,
Collectors.toSet())));
虽然不像groupingBy
收集器那样可读; 您也可以使用toMap
收集器:
myList.stream()
.collect(toMap(SomeClass::getRid, e -> new HashSet<>(singleton(e.getName())),
(l, r) -> {l.addAll(r); return l;}));
确保您具有singleton
和toMap
的必要导入,或者您可以分别使用Collectors.toMap(...)
和Collections.singleton(...)
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.