我正在尝试实现将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) {}
答案 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()));