【问题标题】:Java Streams usage with genericsJava Streams 与泛型的使用
【发布时间】:2021-09-23 09:55:57
【问题描述】:

我有以下课程:

@Data
public class PagedSchoolDto {
    private final Integer count;
    private final Map<String, List<School>> content;
    private final String pagingState;
    private final Boolean hasNext;

    public PagedSchoolDto(final Slice<School> slice) {
        this.content = slice.getContent().stream().collect(
                Collectors.groupingBy(School::getId, () -> new TreeMap<>(new UUIDComparator()), Collectors.toList()));
        this.count = slice.getContent().size();
        this.hasNext = slice.hasNext();
        this.pagingState = getPagingState(slice);
    }

    @Nullable
    private static String getPagingState(final Slice<School> slice) {
        if (slice.hasNext()) {
            CassandraPageRequest pageRequest = (CassandraPageRequest) slice.nextPageable();
            return pageRequest.getPagingState().toString();
        } else {
            return null;
        }
    }
}

现在,我想让我的代码通用,这样我就可以将这个类用于其他对象类型,如下所示:

@Data
public class PagedDto<T> {
    private final Integer count;
    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(
                Collectors.groupingBy(<T>::getId, () -> new TreeMap<>(new UUIDComparator()), Collectors.toList()));
        this.count = slice.getContent().size();
        this.hasNext = slice.hasNext();
        this.pagingState = getPagingState(slice);
    }

    @Nullable
    private static <T> String getPagingState(final Slice<T> slice) {
        if (slice.hasNext()) {
            CassandraPageRequest pageRequest = (CassandraPageRequest) slice.nextPageable();
            return pageRequest.getPagingState().toString();
        } else {
            return null;
        }
    }

}

我所有的类都有一个名为 ID 的属性,它是 UUID 类型,因此比较器应该可以在所有泛型类型中正常工作。问题是我不确定如何编写 Collectors.groupingBy 的函数和供应商代码,因为第二个 sn-p 给出了编译错误。

【问题讨论】:

    标签: java generics lambda stream


    【解决方案1】:

    您的泛型类型 T 未指定,例如'Object' 不提供方法 getId。为了在通用代码中访问 getId,T 必须使用 getId 方法扩展一个接口,该方法由与 PagedDto 一起使用的任何类实现:

    public interface WithId {
        UUID getId();
    }
    
    
    public class School implements WithId {
    
        private UUID id;
    
        @Override
        public UUID getId() {
            return id;
        }
    
    
    public class PagedDto<T extends WithId> {
    ...
    

    【讨论】:

    • @matteo-nnz 很棒的编辑,谢谢!
    猜你喜欢
    • 2023-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多