Java Streams 与泛型的使用

     2023-03-31     131

关键词:

【中文标题】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?不定类型与泛型的使用解决list继承参数(代码片段)

?表示不确定的数据类型。下面我们来看看怎么使用。定义模型和子模型@DatapublicclassModelStringid;Stringname;Stringdesc;@DatapublicclassSubModelextendsModelStringsubName;定义List泛型接口和实现publicinterfaceMultiModelService/***多模 查看详情

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

】Java泛型接口与泛型方法,以及何时使用其中一种【英文标题】:JavaGenericInterfacevsGenericMethods,andwhentouseone【发布时间】:2015-08-1500:38:41【问题描述】:我想知道,除了句法差异之外,什么时候可以在接受泛型参数的方法上使用... 查看详情

kotlin泛型vsjava泛型

...里中的重要概念,以及与Java泛型的对比。1.泛型类型与泛型函数Kotlin下泛型类型与泛型函数的写法࿰ 查看详情

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

第六节:TList与泛型 TList是一个重要的容器,用途广泛,配合泛型,更是如虎添翼。我们先来改进一下带泛型的TList基类,以便以后使用。本例源码下载(delphiXE8版本):FooList.Zip unit uFooList;interfaceuses  Generics.Collecti... 查看详情

java基础:泛型的具体介绍与使用(代码片段)

...使用泛型代码演示三、自定义泛型结构1、自定义泛型类与泛型接口2、代码演示实体类(自定义泛型类:父类Order)实体类(自定义泛型类:父类Order的子类)注意事项:Test举例3、泛型的方法4、自定义... 查看详情

java_集合与泛型

Collection集合,集合是java中提供的一种容器,可以用来存储多个数据。在前面的学习中,我们知道数据多了,可以使用数组存放或者使用ArrayList集合进行存放数据。那么,集合和数组既然都是容器,它们有啥区别呢?数组的长度... 查看详情

java枚举与泛型

目录枚举 泛型枚举枚举类创建:enumSeason1{//1.提供当前枚举类的对象,多个对象之间用","隔开,末尾对象";"结束SPRING("春天","春暖花开"),SUMMER("夏天","夏日炎炎"),AUTUMN("秋天","秋高气爽"),WINTER("冬天","冰天雪地");//2.声明Season对... 查看详情

java泛型的基本介绍和使用

现在开始深入学习java的泛型了,以前一直只是在集合中简单的使用泛型,根本就不明白泛型的原理和作用。泛型在java中,是一个十分重要的特性,所以要好好的研究下。一、泛型的基本概念 泛型的定义:泛型是JDK1.5的一项... 查看详情

java重点--泛型(代码片段)

文章目录💖泛型的概念✨使用泛型的好处与弊端✨定义和使用含有泛型的类✨定义和使用含有泛型的方法✨定义和使用含有泛型的接口✨泛型的通配符✨通配符的高级使用--受限泛型✨斗地主小案例💖泛型的概念泛型是... 查看详情

java泛型java使用泛型的意义

Java泛型Java使用泛型的意义@authorixenos  直接意义在编译时保证类型安全 根本意义a)类型安全问题源自可复用性代码的设计,泛型保证了类型安全的复用模板b)使用复用性模板时不用手动强制类型转换 三种泛型实现... 查看详情

java中泛型的使用

泛型是JavaSE1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法。Java语言引入泛型的好处... 查看详情

java讲课笔记35:初探泛型

文章目录零、本讲学习目标一、泛型的概念二、泛型的好处(一)提高程序类型安全(二)消除强制类型转换三、案例演示泛型使用(一)类使用泛型(二)构造方法使用泛型(三)设置多个泛型(四)使用通配符(五)使用泛... 查看详情

Java - 扩展 HashMap - 对象与泛型行为

】Java-扩展HashMap-对象与泛型行为【英文标题】:Java-ExtendingHashMap-Objectvs.genericsbehaviour【发布时间】:2012-05-0809:45:33【问题描述】:我正在编写一个简单的基于HashMap的缓存,其工作原理如下:如果请求的key在缓存中,则返回其valu... 查看详情

与泛型、接口和扩展混淆

】与泛型、接口和扩展混淆【英文标题】:Confusionwithgenerics,interfaces,andextending【发布时间】:2012-10-0606:40:28【问题描述】:所以我正在尝试为通用链表和跳过列表编写程序。我还想在使用接口和超类时使用它,以备将来使用,但... 查看详情

《java架构筑基》从java基础讲起——泛型的使用

一.泛型的使用1.泛型类的概述及使用A:泛型类概述:把泛型定义在类上B:定义格式:publicclass类名<泛型类型1,…>C:注意事项:泛型类型必须是引用类型2.泛型方法的概述和使用A:泛型方法概述:把泛型定义在方法上B:定义格式:public<... 查看详情

java泛型的其他应用——泛型接口泛型方法泛型数组以及泛型的嵌套设置

学习目标掌握泛型接口的使用掌握泛型方法的定义的及使用掌握泛型数组的使用掌握泛型的嵌套设置之前所有的操作都是在类中直接使用泛型操作的,那么,对于Java来说,也可以直接在接口中定义及使用泛型。定义泛型接口在JD... 查看详情

java泛型简介定义和使用含有泛型的类定义和使用含有泛型的方法定义和使用含有泛型的接口泛型通配符?受限泛型(代码片段)

泛型简介:集合中存储数据的类型称之为泛型,泛型是一种未知的数据类型,当不知道使用什么数据类型的时候可以使用泛型;当创建对象时在指明数据类型并赋值给泛型即可;泛型也可以看做是一个变量ÿ... 查看详情

java学习----泛型

目录  1.泛型的定义  2.泛型的使用  3.泛型通配符 一、泛型的定义  泛型是java5的新特性,使用泛型会让程序编写简单安全,在编译的时候就会检查类型是否安全  定义:所谓泛型就是允许在定义类、接口和方... 查看详情