1、聚合计算
@Test
public void givenUsers_withSimpleSolarFunction_thenGetResult() {
double avg = userList.stream().collect(averagingDouble(User::getAge));
assertEquals((30 + 32 + 41) /3.0, avg);
int sum = userList.stream().collect(summingInt(User::getAge));
assertEquals((30 + 32 + 41), sum);
DoubleSummaryStatistics stat = userList.stream().collect(summarizingDouble(User::getAge));
assertEquals((30 + 32 + 41.0), stat.getSum());
assertEquals((30 + 32 + 41) /3.0, stat.getAverage());
}
2、分组,groupingBy
@Test
public void givenUsers_whenGroupingByAge_thenGetStatWithStream() {
Map<Integer, DoubleSummaryStatistics> map = userList.stream().collect(
groupingBy(
user -> (int) Math.floor(user.getAge() / 10.0) * 10,
summarizingDouble(User::getAge)
)
);
log.debug("result: {}", map);
assertEquals(2, map.get(30).getCount());
assertEquals(32, map.get(30).getMax());
assertEquals(30, map.get(30).getMin());
assertEquals(31, map.get(30).getAverage());
assertEquals(62, map.get(30).getSum());
}
3、参数类型转换,mapping
@Test
public void givenUsers_whenGroupingByAge_thenGetListWithStream() {
Map<Integer, List<UserDto>> result = userList.stream().collect(
groupingBy(
user -> (int) Math.floor(user.getAge() / 10.0) * 10,
mapping(
user -> new UserDto(
user.getId(),
user.getUsername() + ":" + user.getName()
),
toList()
)
)
);
log.debug("result: {}", result);
}
@Test
public void givenStrings_thenMappingAndFiltering_theChainThemTogether() {
List<String> strings = List.of("bb", "ddd", "cc", "a");
Map<Integer, TreeSet<String>> result = strings.stream()
.collect(groupingBy(
String::length,
mapping(
String::toUpperCase,
filtering(
s -> s.length() > 1,
toCollection(TreeSet::new)
)
)
));
log.debug("result: {}", result);
}