繁体   English   中英

Java 8流,将对象列表转换为Map <String, Set<String> &gt;

[英]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;}));

确保您具有singletontoMap的必要导入,或者您可以分别使用Collectors.toMap(...)Collections.singleton(...)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM