Moh*_*ris 0 java hashmap stream java-8 java-stream
我有DTO
一些属性,例如id
、name
、desc
等。
它的所有属性都有 getter 和 setter。
我从服务中得到一个Page<MyDto>
,我需要根据属性对 DTO 进行分组name
。
首先,我使用转换Page<MyDto>
为。List<MyDto>
page.getContent
我需要通过使用对其进行分组来将其转换List
为Map<String, Object>
(不是Map<String,String>
)。names
Java8
我找到了一些例子,但它们没有解决我的问题。
如何将MyDto
列表分组到地图中?
其中键是名称 ( String
),值是Array<MyDto>
每个名称的一个。
例如:
If `List<MyDto>` is :
[
{"id":1, "name":"albert", "desc":"science"},
{"id":2, "name":"george", "desc":"econ"},
{"id":3, "name":"christ", "desc":"math"},
{"id":4, "name":"george", "desc":"literature"} // george repeats twice
]
Run Code Online (Sandbox Code Playgroud)
输出Map
应该是:
{
"george":
[
{"id":2, "name":"george", "desc":"econ"},
{"id":4, "name":"george", "desc":"literature"}
],
"christ":
[
{"id":3, "name":"christ", "desc":"math"}
],
"albert":
[
{"id":1, "name":"albert", "desc":"science"}
]
}
Run Code Online (Sandbox Code Playgroud)
只需使用Collectors::groupingBy
并将方法引用传递给MyDto::getName
将用作地图键的方法:
List<MyDto> dtos = ...
Map<String, List<MyDto>> map = dtos.stream()
.collect(Collectors.groupingBy(MyDto::getName));
Run Code Online (Sandbox Code Playgroud)