在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

mysql字符串分割函数(行转列)

由于工作需要需要处理一些以逗号分隔的字符串&#xff0c;每次都要现做很是麻烦&#xff0c;网上找了很多都没有现成的&#xff0c;好吧&#xff0c;自己动手写一个好了 1 CREATE DEFINER harri% FUNCTION str_for_substr(num int, str varchar(5000))2 RETURNS varchar(100)…

如何使用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;选中…

2015-10-15 css3

图片模糊效果 <img id "img1" src"image/免费学PS.jpg" style"-webkit-filter: blur(5px)"> //webkit解决兼容问题一&#xff1a;特殊选择器 1. *可以匹配任何标记 2. >表示后面是前面的子元素 #d1 span //表示id为d1的div下面的…

proxy aspectj_使用AspectJ,Javassist和Java Proxy进行代码注入的实用介绍

proxy aspectj静态地或在运行时将代码片段注入已编译的类和方法中的功能可能会很有帮助。 这尤其适用于在没有源代码的第三方库中或在无法使用调试器或探查器的环境中对问题进行故障排除。 代码注入对于处理涉及整个应用程序的问题&#xff08;例如性能监视&#xff09;也很有用…

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…

使用可选是可选的

在上周的“收藏中的可选内容”一文发表之后&#xff0c;我不禁要多讲一些关于同一只野兽的事情。 更多细节。 最初由Google Guava引入并后来包含在Java 8软件包中的Optionial类只是包装可选对象的包装器。 从包装对象存在或包装中没有对象的意义上讲&#xff0c;包装对象是可选…

kali 清理系统垃圾文件

网上常用的shell命令 #!/bin/bash echo "clear temp file..." sudo apt-get autoclean # 清理旧版本的软件缓存 sudo apt-get clean # 清理所有软件缓存 sudo apt-get autoremove # 删除系统不再使用的孤立软件 echo "clear disk temp..." sync  #…

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;我们都可以通过重装系统来一劳永…

python常用类型的内置函数列表

1、list.append(obj) 向列表中加入一个对象obj fruits [apple, pear, orange] >>> fruits.append(apple) >>> fruits [apple, pear, orange, apple]2、list.count(obj) 返回一个对象obj在列表中出现的次数 >>> fruits.count(a…

java虚拟内存扩展_Java 8虚拟扩展方法

java虚拟内存扩展我一直关注Java 8 Lambda表达式项目的发展已经有一段时间了&#xff0c;我对其当前的进展状态感到非常兴奋。 我发现的最新“易于理解”的演示文稿是这样的&#xff1a; http://blogs.oracle.com/briangoetz/resource/devoxx-lang-lib-vm-co-evol.pdf 现在&…

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…