在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 。 如果objnull ,则它无法通过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下发布。

由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上实现返回OptionalStream转换方法。 如果传递的实例类型正确,则将返回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);

类型错误或引用为空的实例将使实例测试失败,并导致空的OptionalStream 。 永远不会有ClassCastException

成本与收益

还需要确定这些方法是否会发挥自己的作用:

  • 实际可以使用多少代码?
  • 它们会提高普通开发人员的可读性吗?
  • 节省一行值得吗?
  • 实施和维护它们的成本是多少?

我回答的问题不多很少是的很少 。 因此,它接近于零和游戏,但我确信这是一个很小但不可忽略的收益。

你怎么看? 您看到自己使用这些方法了吗?

翻译自: https://www.javacodegeeks.com/2015/07/casting-in-java-8-and-beyond.html

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

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

相关文章

windows查看文件的md5值

1、winr 输入cmd进入控制界面 2、certutil -hashfile XXXX md5(XXXX为绝对路径) Linux下查看文件md5值&#xff1a; 进入文件目录&#xff0c;使用md5sum加文件名&#xff0c;例如md5sum test.txt

如何使用window.btoa base64对接口数组进行加密处理

大家好&#xff0c;我是孙叫兽&#xff0c;前端全栈工程师&#xff0c;uniapp技术交流群&#xff1a;1149933135 项目采用uniappuView开发&#xff1b; uiapp官方文档&#xff1a;https://uniapp.dcloud.io/ uview官方文档&#xff1a;http://uviewui.com/components/intro.htm…

值得收藏的40个黑客常用入侵端口总结

值得收藏的40个黑客常用入侵端口总结-安全-PHP中文网 常用端口&#xff1a; 21端口渗透剖析 FTP通常用作对远程服务器进行管理&#xff0c;典型应用就是对web系统进行管理。一旦FTP密码泄露就直接威胁web系统安全&#xff0c;甚至黑客通过提权可以直接控制服务器。这里剖析渗透…

csdn个人主页下如何添加微信公众号及超链接

本文以CSDN孙叫兽的博客为例。打开CSDN孙叫兽的博客主页。谷歌浏览器下找到这个页面的源代码&#xff0c;鼠标右键-检查&#xff0c;或者F12打开调试页面。第一步找选中图标&#xff0c;第二步选中目标区域&#xff0c;第三步找到对应的前端代码复制到本地文件&#xff08;选中…

gshark(github敏感信息搜集工具)

gshark 介绍&#xff1a;这是个可视化的监测工具&#xff0c;它不仅可以监控github&#xff0c;还可以监控gitlab‍ 所需环境&#xff1a; go64位gccLinux 一个github账号token&#xff0c;获取地址&#xff1a;https://github.com/settings/tokens 不建议使用window部署&a…

CSDN个人主页下如何添加微信公众号?

本人孙叫兽,前端全站程序员。微信公众号:电商程序员。 本文以CSDN孙叫兽的博客为例。 打开CSDN孙叫兽的博客主页。 谷歌浏览器下找到这个页面的源代码,鼠标右键-检查,或者F12打开调试页面。第一步找选中图标,第二步选中目标区域,第三步找到对应的前端代码复制到…

DotNetOpenAuth实践之搭建验证服务器

系列目录&#xff1a; DotNetOpenAuth实践系列&#xff08;源码在这里&#xff09; DotNetOpenAuth是OAuth2的.net版本&#xff0c;利用DotNetOpenAuth我们可以轻松的搭建OAuth2验证服务器&#xff0c;不废话&#xff0c;下面我们来一步步搭建验证服务器 本次搭建环境&#xff…

PDF如何XSS

简介 在上传点时&#xff0c;如果上传不了图片格式的文件&#xff0c;可以尝试上传html或者pdf文件来达到xss的效果。上传html就不多说了&#xff0c;下面来说说怎么让pdf弹窗。 操作步骤&#xff1a; 环境准备&#xff1a;python3 需要准备poc.py和poc.js poc.py内容 # FRO…

NOI 练手题 图像旋转翻转变换

题目&#xff1a;来源http://noi.openjudge.cn/ch0112/09/ 总时间限制: 1000ms内存限制: 65536kB描述给定m行n列的图像各像素点灰度值&#xff0c;对其依次进行一系列操作后&#xff0c;求最终图像。 其中&#xff0c;可能的操作及对应字符有如下四种&#xff1a; A&#xff1a…

CSDN Chrome插件来啦,听说可以提升开发者效率,我们先来研究一波

孙叫兽,安徽宿州人,北漂前端全栈程序员(朝着这个目标努力),如果你觉得这篇文章帮助了你,记得三连👉(转发+点赞+评论),技术交流请联系个人主页左侧导航栏。 这个插件的定位是提升程序员的开发效率的,至于哪方面?自己慢慢体会,我大致的感觉就是搜索引擎的导航网站的…

C盘全面清理教程!彻底清理所有垃圾!

预计阅读时间 10分钟 资源在文末获取哦 老懒粉应该知道&#xff0c;我们写过“宇宙最细”的系统安装/重装教程 但我们除了新机&#xff0c;通常情况下重装系统的目的是什么&#xff1f; 虽然不管电脑出现了什么样的软件方面问题&#xff0c;我们都可以通过重装系统来一劳永…

url重定向绕过方式

url重定向绕过方式 俗话说的好&#xff0c;上有政策&#xff0c;下有对策&#xff0c;url重定向的绕过姿势也越来越多样化。普通url重定向方法测试不成功&#xff0c;换个姿势&#xff0c;说不定可以再次绕过。 这里总结下成功的绕过方式。 &#xff08;1&#xff09; 使用…

【转】android:DDMS查看Threads--不错

原文网址&#xff1a;http://www.cnblogs.com/mybkn/archive/2012/05/27/2520335.html 有时候程序运行出现死锁或者信号量卡死是很纠结的问题&#xff0c;单看代码很难分析定位问题&#xff0c;这时候可以借助DDMS来查看threads的运行情况&#xff0c;一目了然。 手机连接上USB…

Fastjson反序列化漏洞复现(实战案例)

漏洞介绍 FastJson在解析json的过程中&#xff0c;支持使用autoType来实例化某一个具体的类&#xff0c;并调用该类的set/get方法来访问属性。通过查找代码中相关的方法&#xff0c;即可构造出一些恶意利用链。 通俗理解就是&#xff1a;漏洞利用fastjson autotype在处理json对…

SVN Error: Can‘t connect to host xxxxx‘: 由于目标计算机积极拒绝,无法连接,的最快解决办法

孙叫兽&#xff0c;前端全栈&#xff0c;微信公众号&#xff1a;电商程序员。如果本文对你有帮助&#xff0c;记得点赞关注&#xff0c;谢谢&#xff01; 每次换个新电脑&#xff0c;新项目&#xff0c;新场地&#xff0c;新公司都有可能使用SVN下载老项目,有的是用内网&#x…

百度地图接口调用

当我们网站需要调用百度地图接口的时候&#xff0c;可以使用如下方法&#xff1a; 1.如何获取经纬度坐标 1.打开百度地图&#xff0c;在百度地图最底部找到“地图开放平台”链接。 2.进入“百度地图开放平台”网站中&#xff0c;在导航中选择“”开发文档>坐标拾取器“”…

信息安全系统设计基础第六周学习总结

第六章 存储器层次结构 存储器系统 是一个具有不同容量、成本和访问时间的存储设备的层次结构。 1.CPU寄存器&#xff1a;容量小&#xff0c;成本高&#xff0c;访问快 2.高速缓存存储器&#xff1a;CPU和主存之间的缓存区域 3.主存&#xff1a;磁盘上大容量&#xff0c;成本低…

phpStudy + PhpStorm + XDebug调试【绝对能用】

具体参照的是这篇文章&#xff1a;https://blog.csdn.net/weixin_40418199/article/details/79088365 文章有些地方说的不是很详细想重写整理下。 【PHPStudy演示的版本为&#xff1a;PHP5.4.45-Apache】 1.PHPStudy配置 PHPStudy自带了XDebug的扩展&#xff0c;不需要下载 php…

加密编码类型的密文特征分析

转载https://blog.csdn.net/weixin_45728976/article/details/109219997 MD5、sha1、HMAC算法、NTLM等相似加密类型 1、MD5——示例21232F297A57A5A743894A0E4A801FC3 一般MD5值是32位由数字“0-9”和字母“a-f”所组成的字符串&#xff0c;如图。如果出现这个范围以外的字符…

孙叫兽进阶之路之如何进行情绪管理

程序员不光有硬实力&#xff0c;更要有软实力。 程序员文武双全之道。 ---孙叫兽&#xff0c;前端全栈程序员&#xff0c;微信公众号&#xff1a;电商程序员。 情绪的作用&#xff0c;存在于我们每天的工作和生活中&#xff0c;无时不刻地影响着人们的思想和行为。如何控制和管…