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 和转型操作符,这些操作符已经融入到语言其中了。

对象转换的类型(这个样例中是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的。

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

时间: 2024-10-01 09:06:11

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

Java数据类型转换

Java数据类型转换 1.题目    以下代码输出的结果是: /** * @Title:NumEqual.java * @Package:com.you.user.util * @Description:数据类型转换 * @author:Youhaidong(游海东) * @date:2014-7-23 下午9:38:56 * @version V1.0 */ package com.you.user.util; /** * 类功能说明 * 类修改者 修改日期 * 修改说明 * <p>Titl

Java 数据类型转换

int iValue = new Integer(strValue).intValue();String str = intObj.toString();int number = Integer.parseInt(str); public static Object read(String value, Class type) {        Object ret = value;        if (Integer.TYPE.equals(type)) {            ret =

Java里面类型转换总结

1.String 转 int int i = Integer.valueOf(my_str).intValue(); int i = Integer.parseInt(str); 2.String 转 Integer Integer integer = Integer.valueOf(str); 3.int 转 String 1.) String s = String.valueOf(i); 2.) String s = Integer.toString(i); 3.) String s = "

Java的类型转换

Java的类型转换 在适当的时候,我们会想要将一种数据类型自动转换成另一种,比如把int转化成float类型.Java有隐藏式的自动转换,可以自动转换成想要的类型,但是强制的自动转换的话,.需要将希望得到的数据类型置于圆括号内,放在要进行类型转换的值的左边,可以在下面的示例中看到它: //Java的自动类型转换 byte b; int i=b; long l=b; float f=b; double d=b; //Java强制性的类型转换 int i=88; byte b=(byte)i; ch

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

JAVA强制类型转换(转载+自己的感想) - stemon 时间 2013-10-29 15:52:00  博客园-Java原文  http://www.cnblogs.com/stemon/p/3394464.html 首先声明:这篇文章的大部分是转载的,但是又有自己增加的部分,觉得这样才完整.我增加的部分只是自己的个人见解,推荐出来希望能得到大神的指正.再次说明我推荐出来是讨论的,虽然我潜水很久了,我依旧是菜鸟一枚. 在java中强制类型转换分为基本数据类型和 引用数据类型 两种,这里我们讨

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

Java byte类型转换成int类型时需要 & 0XFF的原因 假设有byte b  = -1; 那么b的二进制是:1111 1111. 如果将b直接转换为int类型,那么二进制是 1111 1111 1111 1111 1111 1111 1111 1111,这显然就不对了. 所以要与b进行&运算 0XFF的二进制是 0000 0000 0000 0000 0000 0000 1111 1111 那么运算之后到结果就是 0000 0000 0000 0000 0000 0000 111

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

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

Java数据类型转换1

1 如何将字串 String 转换成整数 int? A. 有两个方法: 1). int i = Integer.parseInt([String]); 或 i = Integer.parseInt([String],[int radix]); 2). int i = Integer.valueOf(my_str).intValue(); 注: 字串转成 Double, Float, Long 的方法大同小异. 2 如何将整数 int 转换成字串 String ? A. 有叁种方法: 1.) St

Java String类型转换成Date日期类型

插入数据库时,存入当前日期,需要格式转换 import java.text.SimpleDateFormat; formatter = new SimpleDateFormat( "yyyy-MM-dd "); String date = formatter.format(new Date());//格式化数据,取当前时间结果为 2014-10-30 String格式的数据转化成Date格式 import java.text.SimpleDateFormat; formatter =