tcga癌症亚型获取_亚型多态性应用于元组的危险

tcga癌症亚型获取

Java 8具有lambda和stream,但是没有元组,这真是令人遗憾 。 这就是为什么我们在jOOλ中实现了元组-Java 8的缺失部分 。 元组确实是无聊的值类型容器。 本质上,它们只是这些类型的枚举:

public class Tuple2<T1, T2> {public final T1 v1;public final T2 v2;public Tuple2(T1 v1, T2 v2) {this.v1 = v1;this.v2 = v2;}// [...]
}public class Tuple3<T1, T2, T3> {public final T1 v1;public final T2 v2;public final T3 v3;public Tuple3(T1 v1, T2 v2, T3 v3) {this.v1 = v1;this.v2 = v2;this.v3 = v3;}// [...]
}

编写元组类是一项非常无聊的任务,最好使用源代码生成器来完成。

其他语言和API的元组

jOOλ的当前版本具有0至16度的元组。C#和其他.NET语言的元组类型介于1至8之间。有一个专门针对元组的特殊库,称为Javatuple ,元组在1至10之间。英里,并给元组单独的英文名称:

Unit<A> // (1 element)
Pair<A,B> // (2 elements)
Triplet<A,B,C> // (3 elements)
Quartet<A,B,C,D> // (4 elements)
Quintet<A,B,C,D,E> // (5 elements)
Sextet<A,B,C,D,E,F> // (6 elements)
Septet<A,B,C,D,E,F,G> // (7 elements)
Octet<A,B,C,D,E,F,G,H> // (8 elements)
Ennead<A,B,C,D,E,F,G,H,I> // (9 elements)
Decade<A,B,C,D,E,F,G,H,I,J> // (10 elements)

为什么?

因为当我看到恩纳德时,它真的会敲响那甜蜜的钟声

最后但并非最不重要的一点是,jOOQ还具有一个类似于元组的内置类型org.jooq.Record ,它是Record7<T1, T2, T3, T4, T5, T6, T7>等漂亮子类型的基本类型Record7<T1, T2, T3, T4, T5, T6, T7> 。 jOOQ遵循Scala并定义了最高22级的记录。

定义元组类型层次结构时要当心

正如我们在前面的示例中看到的, Tuple3Tuple2有很多共同的代码。

由于数十年来面向对象和多态设计反模式对我们所有人都造成了严重的大脑损害,我们可能认为让Tuple3<T1, T2, T3>扩展Tuple2<T1, T2>是一个好主意,因为Tuple3只是在Tuple2的右边添加了一个属性,对吗? 所以…

public class Tuple3<T1, T2, T3> extends Tuple2<T1, T2> {public final T3 v3;public Tuple3(T1 v1, T2 v2, T3 v3) {super(v1, v2);this.v3 = v3;}// [...]
}

事实是:由于种种原因,这是您可能做的最坏的事情。 首先,是的。 Tuple2Tuple3都是元组,因此它们确实具有一些共同的特征。 将这些功能归为一个普通的超级类型并不是一个坏主意,例如:

public class Tuple2<T1, T2> implements Tuple {// [...]
}

但是学位不是其中之一。 原因如下:

排列

考虑一下您可以形成的所有可能的元组。 如果让元组彼此延伸,那么例如, Tuple5也将与Tuple2分配兼容。 以下将完美地编译:

Tuple2<String, Integer> t2 = tuple("A", 1, 2, 3, "B");

当让Tuple3扩展Tuple2 ,从扩展链中的元组中删除最右边的属性似乎是一个不错的默认选择。

但是在上面的示例中,为什么我不想重新分配(v2, v4)以使结果为(1, 3)或也许是(v1, v3) ,以使得结果为("A", 2)

当将较高程度的元组“减少”到较低程度的元组时,可能会涉及很多可能的属性。 默认情况下,删除最右边的属性对于所有用例而言都不会足够普遍

类型系统

如果Tuple3扩展了Tuple2 ,则对类型系统的影响将比上述情况差得多。 例如,签出jOOQ API。 在jOOQ中,您可以放心地假设以下内容 :

// Compiles:
TABLE1.COL1.in(select(TABLE2.COL1).from(TABLE2))// Must not compile:
TABLE1.COL1.in(select(TABLE2.COL1, TABLE2.COL2).from(TABLE2))

第一个IN谓词是正确的。 谓词的左侧只有一列( 而不是行值表达式 )。 这意味着谓词的右侧也必须对单列表达式进行操作,例如,选择单个列(相同类型)的SELECT子查询。

第二个示例选择了太多列,并且jOOQ API会告诉Java编译器这是错误的。

jOOQ通过Field.in(Select)方法保证了这一点,该方法的签名为:

public interface Field<T> {...Condition in(Select<? extends Record1<T>> select);...
}

因此,您可以提供SELECT语句,该语句产生Record1<T>类型的Record1<T>类型。

幸运的是, Record2不会扩展Record1

如果现在Record2扩展了Record1 ,那么Record1似乎是个好主意,那么第二个查询将突然编译:

// This would now compile
TABLE1.COL1.in(select(TABLE2.COL1, TABLE2.COL2).from(TABLE2))

…即使它形成无效SQL语句。 它将进行编译,因为它将生成Select<Record2<Type1, Type2>>类型,该类型将是Field.in(Select)方法中预期的Select<Record1<Type1>>的子类型。

结论

Tuple2Tuple5类型基本上是不兼容的类型。 在强类型系统中,您一定不要引诱类似类型或相关类型也应该是兼容类型。

类型层次结构是非常面向对象的,从面向对象的角度来看,我的意思是自90年代以来我们仍然遭受着有缺陷和过度设计的面向对象的概念。 即使在“企业”中,大多数人也学会了偏重于继承而不是继承 。 对于元组,组合意味着您可以很好地 Tuple5转换为Tuple2 。 但是您不能分配它。

在jOOλ中 ,可以很容易地完成以下转换:

// Produces (1, 3)
Tuple2<String, Integer> t2_4 = tuple("A", 1, 2, 3, "B").map((v1, v2, v3, v4, v5) -> tuple(v2, v4));// Produces ("A", 2)
Tuple2<String, Integer> t1_3 = tuple("A", 1, 2, 3, "B").map((v1, v2, v3, v4, v5) -> tuple(v1, v3));

这个想法是您对不可变值进行操作,并且可以轻松提取这些值的一部分并将其映射/重组为新值。

翻译自: https://www.javacodegeeks.com/2015/10/the-danger-of-subtype-polymorphism-applied-to-tuples.html

tcga癌症亚型获取

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/336841.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java 隐藏了什么_JAVA程序中封装与隐藏是什么意思

qq_遁去的一_1隐藏就是封装吧。。。。封装是把过程和数据包围起来&#xff0c;对数据的访问只能通过已定义的界面。面向对象计算始于这个基本概念&#xff0c;即现实世界可以被描绘成一系列完全自治、封装的对象&#xff0c;这些对象通过一个受保护的接口访问其他对象。封装是一…

esb 和 开源esb_如果今天完成,ESB会是什么样子?

esb 和 开源esbJavaOne 2015即将结束&#xff0c;这又是一次很棒的社区活动。 我和Rafael进行了两次会议和一次HOL 。 我最喜欢的会议之一实际上是&#xff1a;谈论ESB&#xff0c;如果今天完成的话。 我以为那是过去&#xff1f; 我通常也倾向于这样说。 但是&#xff0c;系统…

log4j2 无日志记录_在Log4j2中更好地执行非日志记录器调用

log4j2 无日志记录使用Log4j 1.x并希望避免在某些情况下可能会造成额外的性能影响&#xff08;即使实际上未记录该消息&#xff09;时&#xff0c;通常使用日志记录防护 。 Java的简单日志记录外观 &#xff08; SLF4J &#xff09;带给Java日志记录的最吸引人的功能之一是能够…

JAVA8如何进行IDEA配置_IntelliJ Idea 配置jdk8

环境&#xff1a; 环境变量JAVA_HOME配置jdk1.8idea配置支持lambda&#xff1a;File -> Project Structure -> Modules -> Language level, 选择: 8-Lambdas, type annotations etc.File -> Project Structure -> Project -> Project language level, 选择…

spring 占位符默认值_Spring中的值注释中的占位符支持

spring 占位符默认值Value批注中的${...}占位符用于访问在PropertySource注册的属性。 这对于Spring应用程序中的Configuration bean非常有用&#xff0c;但不仅如此。 为确保这是可能的&#xff0c; PropertySourcesPlaceholderConfigurer必须存在于所有需要占位符解析的应用程…

java用户名检查数据库_登入界面账号密码是访问数据库,但登入问题时if判断时就是执行不了...

回复 2楼 林月儿我按着你的方法试了下&#xff0c;可还是这个判断不能执行 if(password.equals(drmm.getText())){view.setText("登入成功");完整代码如下&#xff1a;import java.awt.*;import java.awt.event.*;import *;import *;import java.…

五皇后问题 java_Java的5个古怪问题

五皇后问题 java我们有机会接触到一些最奇怪的Java难题 即使是最有经验的Java开发人员&#xff0c;也会在这篇文章中发现令人困惑的问题。 或者至少是有趣的&#xff08;绝对不公平&#xff09;。 在经历了Java Deathmatch冒险之后&#xff0c;我们决定这次发布一系列不同的问…

java加密成固定长度_Java使用MD5加密,生成的密文长度只有31位

在使用MD5加密时&#xff0c;生成的密文长度只有31位&#xff0c;该怎么解决&#xff1f;代码如下&#xff1a;public static String toMd5(String str) {String re null;byte encrypt[];try {byte[] tem str.getBytes();MessageDigest md5 MessageDigest.getInstance("…

可以自定义模板的ide_将IDE检查应用于自定义Java批注

可以自定义模板的ideJ2SE 5中注释的引入改变了我们编写和处理Java的方式。 除了Java SE的预定义注释外 &#xff0c;框架&#xff0c;IDE和工具包还引入了自己的自定义注释 。 Checker框架提供了一些示例&#xff0c;说明如何使用自定义批注在Java中增加类型安全性 。 在本文中…

java设置弹出框为模态_点击按钮弹出模态框的一系列操作代码实例

实现功能提交按钮功能&#xff1a;点击提交按钮的时候都会弹出模态框&#xff0c;但是有不同的状态&#xff1a;审核状态未通过&#xff1a;弹出未通过理由的input输入框&#xff0c;模态框中除了取消和确定按钮&#xff0c;新增确定并保存医院的按钮审核状态已通过&#xff1a…

spock框架_Spock VW:编写自定义的Spock框架扩展

spock框架Spock框架具有多个内置扩展 &#xff0c;这些扩展支持许多核心功能&#xff0c;例如Ignore和Timeout批注。 但更重要的是&#xff0c;鼓励开发人员编写自己的扩展。 例如&#xff0c; SpringExtension很好地将Spock与Spring框架集成在一起。 编写自定义扩展没有很好的…

java log 断点_项目中常见的log日志调用

第一种用法&#xff1a;引用org.apache.commons.logging.Log。import org.apache.commons.logging.Log;import org.apache.commons.logging.LogFactory;private static final Log logger LogFactory.getLog(PolicyAppBizAction.class); //PolicyAppBizAction.class是自己定义…

侦听127.0.01_Spring 4.2中由注释驱动的事件侦听器

侦听127.0.01介绍 在应用程序内交换事件已成为许多应用程序中必不可少的部分&#xff0c;幸运的是&#xff0c;Spring为瞬态事件&#xff08;*&#xff09;提供了完整的基础结构。 最近对事务绑定事件的重构为我提供了一个借口&#xff0c;以在实践中检查Spring 4.2中引入的新的…

java中bpmn流程图_Java学习之BPMN知识以及Activiti的流程部署

BPMN的介绍Activiti项目是一项新的基于Apache许可的开源BPM平台&#xff0c;从基础开始构建&#xff0c;旨在提供支持新的BPMN 2.0标准&#xff0c;包括支持对象管理组(OMG)&#xff0c;面对新技术的机遇&#xff0c;诸如互操作性和云架构&#xff0c;提供技术实现。那什么是BP…

javaone_JavaOne 2015 –第二十版十大收获

javaone我们刚刚在旧金山有了JavaOne的第二十版。 这将是我自2004年以来第十二次参加不间断的系列活动。最大的教训是什么&#xff0c;可以揭示Java的未来。 模块化斗争 自从Java 2007首次提到模块以来&#xff0c;已经花费了将近9年的时间&#xff0c;或者说&#xff0c;直到…

java批量处理数据库语句_Java项目中调用bat批处理进行多用户数据库备份

Java项目中调用bat批处理配合使用BCP进行多用户数据的备份一、项目需求最近项目中需要对数据库(Sql Server系列数据库)进行备份。项目中的需求不是简单的整个数据库的备份&#xff0c;而是根据用户来备份&#xff0c;具体的备份策略如下&#xff1a;①系统为某一赛事管理类型的…

mycat和应用程序集成_企业应用程序集成简介

mycat和应用程序集成本文是我们名为“ EAI的Spring集成 ”的学院课程的一部分。 在本课程中&#xff0c;向您介绍了企业应用程序集成模式以及Spring Integration如何解决它们。 接下来&#xff0c;您将深入研究Spring Integration的基础知识&#xff0c;例如通道&#xff0c;转…

java中读取单个字符_如何使用Java中的Scanner类读取单个字符?

从Java 1.5开始引入Scanner类。此类接受File&#xff0c;InputStream&#xff0c;Path和String对象&#xff0c;使用正则表达式逐个令牌读取所有原始数据类型和String(从给定的源)令牌。默认情况下&#xff0c;空格被视为定界符(将数据分成令牌)。使用Scanner类读取字符Scanner…

java中的case1怎么说_Java Cas20ServiceTicketValidator類代碼示例

本文整理匯總了Java中org.jasig.cas.client.validation.Cas20ServiceTicketValidator類的典型用法代碼示例。如果您正苦於以下問題&#xff1a;Java Cas20ServiceTicketValidator類的具體用法&#xff1f;Java Cas20ServiceTicketValidator怎麽用&#xff1f;Java Cas20Service…

drill apache_使用Apache Drill深入研究当今的大数据

drill apache自2014年9月首次提供Beta版以来&#xff0c; Apache Drill一直在获得广泛的用户采用和社区动力。2015年5月发布了Drill的通用版本-Drill 1.0&#xff0c;此后大量客户在生产中部署和使用了Drill。 在这篇博客文章中&#xff0c;我将简要总结客户在Drill中发现非常宝…