为对象的类型做强制转换是一种很不好的设计。但在某些情况下,我们没有其它选择。Java自诞生的那一天起,就具备这样的功能。

我觉得Java 8在一定程度改善了这项古老的技术。

静态转型

Java中最经常使用的转型方式例如以下:

静态转型

Object obj; // may be an integer
if (obj instanceof Integer) {
Integer objAsInt = (Integer) obj;
// do something with 'objAsInt'
}

这里使用了 instanceof 和转型操作符,这些操作符已经融入到语言其中了。

对象转换的类型(这个样例中是Integer)必须是在编译期静态确定的,所以我们将这样的转型称为静态转型。

假设obj不是Integer,上面的測试就会失败。假设我们以不论什么方式做类型转换,就会得到一个 ClassCastException 异常。假设obj是null,intanceof 測试会失败,可是转型是能够通过的。由于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'
}

由于转换的类型在编译期是不知道,所以我们将这样的转型称之为动态转型。

对错误类型和 null 转型的測试结果,与静态转型的结果是全然一致的。

Stream及Optional的转型

如今

对 Optional 中的值或 Stream 中的元素转型须要两个步骤:第一步,我们须要过滤掉错误的类型,然后我们须要将其转换为目标类型。

Optional中的转型

Optional<?> obj; // may contain an Integer
Optional<Integer> objAsInt = obj
.filter(Integer.class::isInstance)
.map(Integer.class::cast);

我们须要两个步骤来完毕转型,这尽管不是什么大问题,可是我感觉还是有一点笨拙和冗余。

未来(可能)

我建议Class的强制转型方法能返回一个 Optional 或者 Stream。

假设传递的对象的类型是正确的。则返回一个包括该对象的Optional或Stream。

否则返回的Optional或Stream不包括不论什么元素。

这些方法的实现比較琐碎:

Class上的新方法

public Optional<T> castIntoOptional(Object obj) {
if (isInstance(obj))
return Optional.of((T) obj);
else
Optional.empty();
} public Stream<T> castIntoStream(Object obj) {
if (isInstance(obj))
return Stream.of((T) obj);
else
Stream.empty();
}

我们能够使用 flatMap 一步完毕过滤和强制转换:

FlatMap的实现:

Stream<?

> stream; // may contain integers
Stream<Integer> streamOfInts = stream.
flatMap(Integer.class::castIntoStream);

错误的实例类型或者null引用。在实例測试的时候会失败。所以返回空的 Optional 或 Stream。这样的方式永远不会抛出 ClassCastException 异常。

成本和收益

我们怎么来衡量这些方法是否真正实用呢?

有多少代码真正会使用它们?

对于一个中等水平的开发人员来说,它们能否提高代码的可读性?

是否值得为其节约一行代码?

实现和维护它们的成本是多少?

我对这些问题的回答是:不多。是很少。

所以。这是一个总和趋近于0的游戏。可是,我能够证明尽管收益不多。但却是大于0的。

你怎么觉得的呢?你自己会使用这些方法吗?

Java 8 类型转换及改进的更多相关文章

  1. Java 基础类型转换byte数组, byte数组转换基础类型

    Java 基础类型转换byte数组, byte数组转换基础类型 Java类型转换 java类对象转化为byte数组

  2. Java数据类型转换浅析

    Java数据类型转换分为两种:自动类型转换和强制类型转换. 数据类型转换的关键是数据类型相应的表数范围大小 1.自动类型转换: 概念:小范围数据类型会自动转化成大范围数据类型 实例: int a=10 ...

  3. 关于Java String 类型转换时null的问题(转)

    关于Java String 类型转换时null的问题 开发中经常遇到从集合类List.Map中取出数据转换为String的问题,这里如果处理不好,经常会遇到空指针异常java.lang.NullPoi ...

  4. Java的类型转换

    Java的类型转换 在适当的时候,我们会想要将一种数据类型自动转换成另一种,比如把int转化成float类型.Java有隐藏式的自动转换,可以自动转换成想要的类型,但是强制的自动转换的话,.需要将希望 ...

  5. Java byte类型转换成int类型时需要 & 0XFF的原因

    Java byte类型转换成int类型时需要 & 0XFF的原因 假设有byte b  = -1; 那么b的二进制是:1111 1111. 如果将b直接转换为int类型,那么二进制是 1111 ...

  6. Java里面类型转换总结

    1.String 转 int int i = Integer.valueOf(my_str).intValue(); int i = Integer.parseInt(str); 2.String 转 ...

  7. JAVA强制类型转换(转载+自己的感想) - stemon

    JAVA强制类型转换(转载+自己的感想) - stemon 时间 2013-10-29 15:52:00  博客园-Java原文  http://www.cnblogs.com/stemon/p/33 ...

  8. Java数据类型转换1

    1 如何将字串 String 转换成整数 int? A. 有两个方法: 1). int i = Integer.parseInt([String]); 或 i = Integer.parseInt([ ...

  9. Java List 类型转换

    java的类型转换让人忍不住在开始编码前骂一声  FUCK! 1  子类转父类 up List<SubClass> subs = ...; List<? extends BaseCl ...

随机推荐

  1. 管理mysql数据严格模式,和安全模式处理

    最近使用mysql数据库高一点的版本遇到了,插入和修改等语句失败情况.语句没有错误,但是workbench提示 Field 'id' doesn't have a default value.原因是 ...

  2. SQLServer2008 在where条件中使用CASE WHEN

    create table #temp(    id int identity(1,1),    name varchar(20),    startYear int,    startMonth in ...

  3. 单个句子<code> 多行代码显示<pre> 键盘输入<kbd>

    1.用来显示单个句子或者单个单词:<code>……</code> 2.用来显示多行代码:<pre>……</pre> 当行数高度大于340px,自动出现y ...

  4. Django学习案例一(blog):六. 开发博客内容页面

    目标:某条博客具体内容的展示,可返回博客主页面,可进行评论. 1. 编辑路由 一篇博客,要将其找出来,就需要有一个唯一的标识.Django 的模型中默认有一个唯一的且未自增长的主键,即 id 字段.我 ...

  5. poj1101 the game 广搜

    题目大意: 类似于连连看,问从起点到终点最少需要几条线段. 规则: 1.允许出界. 2.空格的地方才能走. 分析: 题目做下来发现没有卡时间,所以主要还是靠思路.也就是说不用考虑离线算法.直接以每个起 ...

  6. linux 新添加的硬盘格式化并挂载到目录下

    需求: 新增加一块硬盘sdb,将sdb分区,只分一个区,格式化,挂载到目录/ssd下. 1.  查看现在已有的分区状态 # df –l 图中显示,没有看到sdb硬盘 2.  查看服务器安装的硬盘状态( ...

  7. 学习廖雪峰的Python教程之数据类型

    数据类型 计算机顾名思义就是可以做数学计算的机器,因此,计算机程序理所当然地可以处理各种数值.但是,计算机能处理的远不止数值,还可以处理文本.图形.音频.视频.网页等各种各样的数据,不同的数据,需要定 ...

  8. 《3D建模初步》参考资料

    本门课程主要从3D打印角度来介绍3D建模的简单知识.课程采用免费的3D CAD软件Autodesk 123D Design来具体演示一些简单模型的构建方法,并介绍3D打印有关的知识与方法. 课程以&l ...

  9. PAT_A1113#Integer Set Partition

    Source: PAT A1113 Integer Set Partition (25 分) Description: Given a set of N (>) positive integer ...

  10. UVA1339 - Ancient Cipher 【字符串+排序】【紫书例题4.1】

    题意:给定两个字符串,你可以替换或者置换,替换是指可以将相同的字母替换为任意一个字母,而置换是指将字母替换为下一个,如A替换B,B替换为C,,,Z替换为A.你需要判断是否可以通过一系列操作使两个字符串 ...