Java流-将流结果从一个对象转换为另一个

时间:2019-12-30 10:51:07

标签: java java-stream

我正在尝试实现将Stream<PersonData>更改为Stream<Person>的功能。作为输入参数,它获取Stream<PersonData>并返回Stream<Person>

PersonData是有关某人的信息,并具有以下格式:

{id: person1, Car: 'ford'}, {id: person1, Car: 'porsche'}, {id: person1, Car: 'seat'}

,我想将这三个PersonData分组到一个对象Person中。结果应该是这样:

{id: person1, Cars: ['ford','porsche', 'seat']}

我想按ID分组,然后创建一个人员列表。我已经定义了表达式,但现在我想将其转换为流

public static Stream<Person> getPersonById(Stream<PersonData> stream) {
    Map<String, List<String>> newMap = stream.collect(Collectors.groupingBy(PersonData::getID,
          Collectors.mapping(PersonData::getCarName, Collectors.toList())));
    // TODO: Transform  Map<String, List<String>> to Stream<Person>
    return newMap;
}

更新: Person的构造函数是:

public Person(int id, List<String> Cars) {}

1 个答案:

答案 0 :(得分:3)

  

Person的构造函数很抱歉:Person(int id, List<String> Cars)

在这种情况下,您的代码应如下所示:

return newMap.entrySet().stream()
        .map(e -> new Person(Integer.valueOf(e.getKey()), e.getValue()));

或者如果您想一次拍摄:

return stream.collect(Collectors.groupingBy(PersonData::getId,
        Collectors.mapping(PersonData::getCarName, Collectors.toList())
)).entrySet().stream()
        .map(e -> new Person(Integer.valueOf(e.getKey()), e.getValue()));

我还建议在private Integer id;中使用PersonData以避免将String转换为整数,这样您的代码将是:

...
.map(e -> new Person(e.getKey(), e.getValue()));