Java Streams 与泛型的使用

Posted

技术标签:

【中文标题】Java Streams 与泛型的使用【英文标题】:Java Streams usage with generics 【发布时间】: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 给出了编译错误。

【问题讨论】:

【参考方案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 很棒的编辑,谢谢!

以上是关于Java Streams 与泛型的使用的主要内容,如果未能解决你的问题,请参考以下文章

Java ?不定类型与泛型的使用解决List继承参数

Kotlin 泛型 VS Java 泛型

delphi 线程教学第六节:TList与泛型

Java 泛型接口与泛型方法,以及何时使用其中一种

Java基础Java中的语法糖

作业09-集合与泛型 java