You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java Stream泛型使用:分页DTO改通用类时groupingBy编译错误如何解决

你遇到的编译错误核心有两个原因:

  1. <T>::getId是非法的Java方法引用语法,泛型标记不需要写在方法引用的类名位置
  2. 泛型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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 18:45:04