flatMap Optional
public static void main(String[] args) {
// 获取每个人员,每年的最新成绩
List<Map<String, Object>> list = new ArrayList<Map<String, Object>>() {{
add(new HashMap<String, Object>(4) {{ put("name", "张三");put("year", 2021);put("score", 8.6);put("date", "2021-10-01"); }});
add(new HashMap<String, Object>(4) {{ put("name", "张三");put("year", 2021);put("score", 9.1);put("date", "2021-12-01"); }});
add(new HashMap<String, Object>(4) {{ put("name", "张三");put("year", 2022);put("score", 9.7);put("date", "2022-07-01"); }});
add(new HashMap<String, Object>(4) {{ put("name", "李四");put("year", 2022);put("score", 5.5);put("date", "2022-07-01"); }});
add(new HashMap<String, Object>(4) {{ put("name", "李四");put("year", 2022);put("score", 7.7);put("date", "2022-09-01"); }});
}};
List<Map<String, Object>> collect =
list.stream().collect(
/*
* 拿到list信息
* 1、先按人员年份进行分组;
* 2、再返回每年中时间最新的数据。
*/
Collectors.groupingBy(
map -> map.get("name").toString() +
map.get("year"),
Collectors.maxBy(Comparator.comparing(map -> map.get("date").toString()))
)).values().stream()
/*
* flatMap(将各个生成流扁平化为单个流):
* 分组groupingBy,会将lisPacsInfoList划分为多个流,
* flatMap方法把一个流中的每个值都换成另一个流,然后把所有的流连接起来成为一个流。
*/
.flatMap(part -> toList(part).stream())
.collect(Collectors.toList());
for (Map<String, Object> map : collect) {
System.out.println(map);
}
}
/**
* 调用此静态方法,将 Optional(对象容器) 转换为 List/Set 方法。
*
* @param option option
* @param <T> 容器内对象类型
* @return list集合
*/
public static <T> List<T> toList(Optional<T> option) {
return option.
map(Collections::singletonList).
orElse(Collections.emptyList());
}
public static <R, A, T> R collect(Optional<T> option, Collector<? super T, A, R> collector) {
final A container = collector.supplier().get();
option.ifPresent(v -> collector.accumulator().accept(container, v));
return collector.finisher().apply(container);
}
DJOSIMON