在Java 8中进行投射(还有其他功能?)
将实例转换为设计不良的类型。 尽管如此,在某些情况下没有其他选择。 从第一天开始,这种能力就已经成为Java的一部分。
我认为Java 8提出了对这种古老技术稍加改进的需求。
静态铸造
用Java进行转换的最常见方法如下:
静态铸造
Object obj; // may be an integer
if (obj instanceof Integer) {Integer objAsInt = (Integer) obj;// do something with 'objAsInt'
}
这使用了嵌入到该语言中的instanceof
和cast运算符。 实例转换为的类型(在本例中为Integer
在编译时必须是静态已知的,因此我们将其称为静态转换。
如果obj
不是Integer
,则上述测试将失败。 如果我们尝试将其强制转换,则会得到ClassCastException
。 如果obj
为null
,则它无法通过instanceof
测试,但可以强制转换,因为null
可以是任何类型的引用。
动态铸造
我很少遇到的一种技术是使用Class
上与运算符相对应的方法:
动态转换为已知类型
Object obj; // may be an integer
if (Integer.class.isInstance(obj)) {Integer objAsInt = Integer.class.cast(obj);// do something with 'objAsInt'
}
请注意,尽管在此示例中,在编译时也知道要强制转换为的类,但不一定如此:
动态铸造
Object obj; // may be an integer
Class<T> type = // may be Integer.class
if (type.isInstance(obj)) {T objAsType = type.cast(obj);// do something with 'objAsType'
}
因为类型在编译类型时是未知的,所以我们将其称为动态转换。
类型和空引用错误的实例的测试和转换结果与静态转换完全相同。
由vankarsten在CC-BY-NC 2.0下发布 。
在流中投放和可选
现在
转换Optional
的值或Stream
的元素是一个两步过程:首先,我们必须过滤掉错误类型的实例,然后才能将其转换为所需的类型。
使用Class
上的方法,我们使用方法引用来实现。 以Optional
为例:
强制转换
Optional<?> obj; // may contain an Integer
Optional<Integer> objAsInt = obj.filter(Integer.class::isInstance).map(Integer.class::cast);
我们需要两个步骤来执行此操作没什么大不了的,但是我觉得这有点尴尬,而且比必要时更冗长。
未来(也许)
我建议在Class
上实现返回Optional
或Stream
转换方法。 如果传递的实例类型正确,则将返回Optional
或包含转换实例的Singleton Stream
。 否则,两者都将为空。
实现这些方法很简单:
课堂上的新方法
public Optional<T> castIntoOptional(Object obj) {if (isInstance(obj))return Optional.of((T) obj);elseOptional.empty();
}public Stream<T> castIntoStream(Object obj) {if (isInstance(obj))return Stream.of((T) obj);elseStream.empty();
}
这使我们可以使用flatMap一步进行过滤和转换:
该死的FlatMap
Stream<?> stream; // may contain integers
Stream<Integer> streamOfInts = stream.flatMap(Integer.class::castIntoStream);
类型错误或引用为空的实例将使实例测试失败,并导致空的Optional
或Stream
。 永远不会有ClassCastException
。
成本与收益
还需要确定这些方法是否会发挥自己的作用:
- 实际可以使用多少代码?
- 它们会提高普通开发人员的可读性吗?
- 节省一行值得吗?
- 实施和维护它们的成本是多少?
我回答的问题不多 , 很少 , 是的 , 很少 。 因此,它接近于零和游戏,但我确信这是一个很小但不可忽略的收益。
你怎么看? 您看到自己使用这些方法了吗?
翻译自: https://www.javacodegeeks.com/2015/07/casting-in-java-8-and-beyond.html
在Java 8中进行投射(还有其他功能?)相关推荐
- java channel midi_为Java程序中添加播放MIDI音乐功能
下载本文示例代码 Java在多媒体处理方面的确优势不大,但是我们在程序中有些时候又需要一些音乐做为点缀,如果播放的音乐是wav等波形音频文件,又挺大,所以背景音乐最好就是MIDI了,可是网上很多播放M ...
- Java ArrayList中retainAll()方法具有什么功能呢?
转自: Java ArrayList中retainAll()方法具有什么功能呢? 下文笔者讲述java中ArrayList方法的功能简介说明,如下所示: retainAll()方法的功能:用于保留 a ...
- 美图手机投射功能在哪_在Java 8中进行投射(还有其他功能?)
美图手机投射功能在哪 将实例转换为设计不良的类型. 尽管如此,在某些情况下没有其他选择. 从第一天开始,执行此功能就已成为Java的一部分. 我认为Java 8提出了对这种古老技术稍加改进的需求. 静 ...
- java Swing中JTextField自动补全功能例子
涉及到两个Java类 主类:AutoCompleteComponet.java 数据类:AutoCompleteComponet.java 效果图如下: 代码如下: 主类:AutoCompleteCo ...
- JAVA应用中集成SF的chatter功能及开发步骤
项目中,需要与SF合作,使用SF提供的Chatter功能,即将车的实时数据信息,工况,DTC等数据自动提交到SF的chatter上面,一边让群组内的所有人员共享或帮忙解决问题.所以应用获取到相关数据后 ...
- Java 语言中十大“坑爹”功能!
点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 来源:https://www.sohu.com/a/35 ...
- Java 9中的5个功能将改变您开发软件的方式(还有2个不会)
有望在Java 9中发布的最令人兴奋的功能是什么? 不要对Java 9的相对沉默近来分散注意力.JDK提交者正在努力准备下一个版本,该版本预计将在2015年12月完成,而功能将在几个月后完成 .此后, ...
- Java 8中新的并行API:Glitz和Glamour的背后
我是一个出色的多任务处理者. 即使我在写这篇文章,我仍然可以为昨天在一个大家都对我陌生的聚会上发表的言论感到尴尬. 好消息是,我并不孤单– Java 8在多任务处理方面也相当出色. 让我们看看如何. ...
- Java 8中的5个功能将改变您的编码方式
Java 8在JVM和语言级别都包含了一些非常令人兴奋的功能. 虽然最初为该发行版设想的某些功能已扩大范围或已推出到第9版,但实际上有数十个新功能. 许多新添加的内容在编译器,JVM或帮助系统级别都进 ...
最新文章
- Linux cp命令如何拷贝整个目录下所有文件
- 自监督媲美全监督,港中文、商汤场景去遮挡方法入选 CVPR 2020 Oral
- ehcache + spring 整合以及配置说明 ,附带整合问题 (已解决)
- myeclipse 如何显示序号
- LINUX系统管理----GRUB笔记
- 应用程序无法启动_Windows 10触发启动应用程序警报,以避免系统变慢
- 美女的床真的好难爬......
- Spring 3.2矩阵变量是什么? –第2部分:代码
- 在c语言中预处理命令行都以井号开头,以井号开头的行和gcc预处理器输出中的'#1“ac”'之类的数字是什么意思?...
- restfull服务器端获取文件,使用 FileREST API (获取文件服务) - Azure 文件存储 | Microsoft Docs...
- Sublime一些问题以及解决方法
- 用LinkedList模拟栈(Java容器)
- EMI辐射发射超标案例
- mysql gtid 1236错误_错误1236
- 罗永浩两年还债4个亿,我却被《真还传》圈粉
- unity给定两个点和中间点的其中一个坐标比如z坐标,求该点的坐标
- 文件夹快速隐藏,文件夹选项中勾选隐藏目录依旧不能使其显示
- 唐太宗管理之道:收人,收心,收天下
- arcgis字段计算器赋值_【干货】关于ArcGIS的这62个常用技巧,你造吗?
- 教育培训行业市场营销推广方案分享
热门文章
- 最全三大框架整合(使用映射)——Dept.hbm.xml
- 2017蓝桥杯省赛---java---B---2(纸牌三角形)
- 文件上传与下载----SpringMVC
- Kafka启动出现Error: Could not create the Java Virtual Machine. Error: A fatal exception has occurred. Pr
- oracle 删除时间段的,oracle SQL如何从日期中删除时间
- android roboguice2,Android快速开发框架 roboguice
- 基于maven的SpringMVC+Spring+MyBatis+Log4j2的pom配置
- Java虚拟机详解----常用JVM配置参数
- MySQL的自然联结+外部联结(左外连接,右外连接)+内部联结
- 单列集合Set的实现类HashSet