Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >按子类型划分的Java组对象

按子类型划分的Java组对象
EN

Stack Overflow用户
提问于 2020-01-23 08:05:51
回答 1查看 399关注 0票数 1

我有一个超类(List<SuperClass> classes = ...)列表,我想根据它们的子类型将它们分成单独的列表。我想用参数化的列表结束这个子类型,即List<A> aClasses = ... List<SuperClass> aClasses = ...而不是

鉴于这个类的层次结构:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
abstract class SuperClass {...}
class A extends SuperClass {...}
class B extends SuperClass {...}
class C extends SuperClass {...}

这是我到目前为止所得到的,这是有效的。问题是,当迭代aClassesbClassescClasses列表时,我需要在循环中使用强制转换对象。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
List<SuperClass> classes = ... // mix of A, B, and C

Map<Class<? extends SuperClass>, List<SuperClass>> grouped = classes.stream()
    .collect(Collectors.groupingBy(SuperClass::getClass, Collectors.toList()));

List<SuperClass> aClasses = grouped.get(A.class);
List<SuperClass> bClasses = grouped.get(B.class);
List<SuperClass> cClasses = grouped.get(C.class);

我知道这是可行的,但我正在寻找更简洁的代码(可能使用流)。尽管在编写了下面的代码之后,我想我还能用流做的任何事情都可能和下面的代码一样“复杂”。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
List<A> aClasses = new ArrayList<A>();
List<B> bClasses = new ArrayList<B>();
List<C> cClasses = new ArrayList<C>();
for (SuperClass superClass : classes) {
    if (superClass instanceof A) {
        aClasses.add(superClass);
    }
    else if (superClass instanceof B) {
        bClasses.add(superClass);
    }
    else if (superClass instanceof C) {
        cClasses.add(superClass);
    }
}

生成的类将被输入到具有以下签名的方法中:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
void processA(List<A> aClasses);
void processB(List<B> bClasses);
void processC(List<C> cClasses);

我不打算这么做:processA((List<A>) (List) aClasses);

EN

回答 1

Stack Overflow用户

发布于 2020-01-23 08:24:47

我不知道有什么比你描述的更好的方式,但我想看看它是否存在。

instanceof检查可能是最好的方法,我可能会这样做。您描述的Map路由将需要转换,因为类型未知。

您可以使用流来完成它,但是这需要对列表进行三次迭代。如果列表很小,这可能是可以的,但我仍然会在代码评审中拒绝它。也就是说,如果你需要一种颜色的话,它可能会很有用。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
List<Red> reds = colors.stream()
            .filter(color -> color instanceof Red)
            .map(color -> (Red)color)
            .collect(Collectors.toList());

不过,除了一种颜色,我不会再用这个了。一旦添加了第二种颜色,标准的for循环方法就会更好。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59882690

复制
相关文章
Java 对象数组按某个属性排序
新建一个Student对象 public class Student { private String name; private double score; public Student(String name,double score) { super(); this.name = name; this.score = score; } public String getName() { re
赵哥窟
2021/12/16
2.9K0
java hibernate 实现按条件删除多对象[通俗易懂]
具体做法是遍历对象对象的所有get方法,然后通过方法反射获取到对象的值。然后再判断值是否为空,从而组装HQL语句
全栈程序员站长
2022/07/04
1.5K0
java对象组声明_如何在Java中声明对象数组?
可以创建对象类数组,该数组可以接受任何类型的对象。在此类数组上运行期间,可以使用instanceof运算符。
全栈程序员站长
2022/08/30
3.8K0
java之对象类型转换
基本数据类型之间的转换: 自动类型转换:小的数据类型可以自动转换成大的数据类型; 强制类型转换:可以把大的数据类型转换成小的数据类型:float = (float)32.0; public class Person extends Object{} public class Student extends Person{} 对java对象的强制类型转换成造型: 从子类到父类的类型转换可以自动进行; Student s = new Student(); Person p = s; String a = "h
西西嘛呦
2020/08/26
9200
Java入门(9.3)-- 对象类型的转换
常规的继承图都是将顶级类设置在页面的顶部,然后逐渐向下,所以将子类对象看作是父类对象被称为向上转型。由于向上转型是从一个较具体的类到较抽象的类的转换,所以它总是安全的。
爱学习的程序媛
2022/04/07
8470
Java入门(9.3)-- 对象类型的转换
Matplotlib子图划分——非均匀绘图
本节主要探讨matplotlib子图的非均匀划分,并在文末补充了axes对象的常用属性。
python数据可视化之路
2023/02/23
1.4K0
Matplotlib子图划分——非均匀绘图
java 用getClass()获取对象的类型类
getClass方法可以获取一个对象的类型类,然后在调用该类的方法可以获取该类的相关信息,比如父类的名字,该类的名字等
全栈程序员站长
2022/07/04
1.6K0
图像分类每个标签按比例划分数据
在做图像分类时候,会收集一批相应的数据,这里将其称为总数据集total-data,
用户3578099
2020/11/30
1.5K0
图像分类每个标签按比例划分数据
java 内存划分
java 虚拟机在 java 程序执行过程中会将内存划分为若干个不同的数据区域,如下图所示:
用户3147702
2022/06/27
4200
java 内存划分
外显子组及全外显子组测序WES
外显子是蛋白质的编码区域,是这和生物基因组的一部分。基因组中的全部外显子称为外显子组。人类基因组大约有1.8*10^5个外显子,30Mb,占人类基因组的1%。 研究表明,人类85%以上的疾病基因都由外显子碱基突变造成。
Y大宽
2019/05/23
2.7K0
java对象类型转换_cdr轮廓转换为对象
要将 Java 对象或 POJO (普通旧 Java 对象)转换为 JSON,我们可以使用JSONObject将对象作为参数的构造函数之一。在下面的示例中,我们将StudentPOJO 转换为 JSON 字符串。Student类必须提供 getter 方法,JSONObject通过调用这些方法创建 JSON 字符串。
全栈程序员站长
2022/10/02
9280
回文子串划分(基础DP)- UVA 11584
今天带来一个简单的线性结构上的DP,与上次的照明系统(UVA11400)是同一种类型题,便于大家类比、总结、理解,但难度上降低了。
ACM算法日常
2018/09/21
6690
回文子串划分(基础DP)- UVA 11584
【JAVA】JVM 内存区域的划分
本博文将从内存管理的角度,进一步探索 Java 虚拟机(JVM)。垃圾收集机制为我们打理了很多繁琐的工作,大大提高了开发的效率,但是,垃圾收集也不是万能的,懂得 JVM 内部的内存结构、工作机制,是设计高扩展性应用和诊断运行时问题的基础,也是 Java 工程师进阶的必备能力。
sidiot
2023/08/31
2470
【JAVA】JVM 内存区域的划分
MySQL中的字段类型对应于Java对象中的数据类型
  我在网上也搜过很多,就是想知道在数据库中的建表语句的字段类型对应Java实体类中属性的类型是什么。
砖业洋__
2023/05/06
2.9K0
MySQL中的字段类型对应于Java对象中的数据类型
Oracle使用对象类型3(MEMBER方法的对象类型)
MERMER方法用于访问对象实例的数据,如果在对象类型中需要访问特定对象实例的数据,则必须要定义MEMBER方法。 MEMBER方法只能由对象实例调用,不能由对象类型调用。 下面以建立和使用对象类型person_typ2为例: 包含name,gender,birthdate和address等四个属性,以及一个MEMBER过程change_address和一个MEMBER函数get_info。 CREATE OR REPLACE TYPE person_typ2 AS OBJECT( name VARCHAR
小小明童鞋
2018/06/13
1.7K0
java:BeanProperSupport实现复杂类型对象的成员访问
在实际的工程设计中,当我们设计了一个复杂的数据对象,对象中还嵌套有子对象,子对象可能还会有更多的嵌套时,如果没有工具辅助,要获取一个对象的子成员下的子成员,需要写好几行代码逐级获取,这中间还要涉及到判空的问题,如果成员类型是Map/JSON对象那还要从Map中读取子成员,如果是Sting 类型JSON字符串,那获取下面的子成员更麻烦还要涉及解析JSON解析。往涉及到这种复杂的多级嵌套的子成员变量读写,程序代码都会变得很臃肿,繁琐。
10km
2022/11/18
1.8K0
JS/TS 对数组中的对象按对象的值进行去重
举个例子:对以下数组按 lastName 的值进行去重 let listData = [ { firstName: "Rick", lastName: "Sanchez", size: 18 }, { firstName: "Morty", lastName: "Smith", size: 6 }, { firstName: "Jerry", lastName: "Smith", size: 3 }, { firstName: "Beth", lastName: "Smith", size:
Leophen
2020/10/09
7.1K0
JS/TS 对数组中的对象按对象的值进行去重
DDD划分领域、子域、核心域、支撑域的目的
在《DDD兴起的原因以及与微服务的关系》中曾举了一个研究桃树的例子,如果要研究桃树,将桃树根据器官分成根、茎、叶、花、果实、种子,这每一种器官都可以认为是一个研究领域,而领域又有更加具体的细分,分成子域、核心域、通用域、支撑域等,下面回顾桃树这个例子
架构之家
2022/07/12
1.4K0
DDD划分领域、子域、核心域、支撑域的目的
JAVA对象转map_java处理字符串类型的map
Object succesResponse = JSON.parse(out); //先转换成Object
全栈程序员站长
2022/10/03
1.4K0
点击加载更多

相似问题

按对象列表中的值划分的Java组对象

12

按子组划分的密度图

11

按对象类型划分的WPF列表框组

11

按元素类型划分的SimpleXML组

26

按字段类型划分的ES6组数组对象

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文