Java Stream泛型使用:分页DTO改通用类时groupingBy编译错误如何解决
你遇到的编译错误核心有两个原因:
<T>::getId是非法的Java方法引用语法,泛型标记不需要写在方法引用的类名位置- 泛型
T没有类型约束,编译器无法确认T类存在getId()方法,直接写T::getId也会编译失败
解决方案
第一步:定义统一标识接口
因为所有业务类都有UUID类型的id属性,先定义一个公共接口统一获取id的方法,所有业务类实现该接口:
public interface Identifiable { // 若你业务类的getId返回值是String类型的UUID字符串,可把返回值改为String UUID getId(); }
你的原有业务类(比如School)修改为实现该接口即可,原有属性和逻辑不需要调整:
public class School implements Identifiable { // 原有代码保持不变 }
第二步:修正泛型DTO代码
给PagedDto的泛型加上类型上限,同时修正Collectors.groupingBy的参数:
@Data public class PagedDto<T extends Identifiable> { private final Integer count; // 如果不需要把ID转成字符串,这里可改为Map<UUID, List<T>>类型,和实际需要对齐 private final Map<String, List<T>> content; private final String pagingState; private final Boolean hasNext; public PagedDto(final Slice<T> slice) { this.content = slice.getContent().stream().collect( // 若getId本身返回String就去掉toString(),直接写T::getId Collectors.groupingBy(t -> t.getId().toString(), // TreeMap的泛型要和Map的key类型保持一致 () -> new TreeMap<String, List<T>>(new UUIDComparator()), Collectors.toList())); this.count = slice.getContent().size(); this.hasNext = slice.hasNext(); this.pagingState = getPagingState(slice); } @Nullable private static <T extends Identifiable> String getPagingState(final Slice<T> slice) { if (slice.hasNext()) { CassandraPageRequest pageRequest = (CassandraPageRequest) slice.nextPageable(); return pageRequest.getPagingState().toString(); } else { return null; } } }
内容的提问来源于stack exchange,提问作者T Anna
相关产品推荐
相关产品推荐

