java - 将list<bean> 强转成另一种bean的list。
PHP中文网
PHP中文网 2017-05-17 10:07:31
[Java讨论组]
public static class DataBean {
    private int value;
    private BigDecimal name;}
public class ChartData {
    private Integer time;
    private BigDecimal result;}

我需要类似于如下的操作,

List<ChartData> data = getdata();
List<SeriesBean.DataBean> yValue = data.stream().map(item -> (SeriesBean.DataBean) item);

报错不可转换的类型,DataBean是个内部静态类。
C++里面有reinterpret_cast可以强转,java应该有相应的方法的

PHP中文网
PHP中文网

认证0级讲师

全部回复(4)
大家讲道理

Apache CommonsBeanUtilsSpringBeanUtils 都有提供 copyProperties 方法,作用是将一个对象的属性的值赋值给另外一个对象,但前提是两个对象的属性类型且 名字 相同。

比如使用 Apache Commons 的 BeanUtils

import java.math.BigDecimal;
import org.apache.commons.beanutils.BeanUtils;

public class TestBeanUtils {

    public static void main(String[] args) throws Exception {

        ChartData src = new ChartData(1, BigDecimal.valueOf(123));
        DataBean dest = new DataBean();

        BeanUtils.copyProperties(dest, src);

        System.out.println(src);
        System.out.println(dest);
    }

    public static class DataBean {

        private int time;
        private BigDecimal result;

        public int getTime() {
            return time;
        }

        public void setTime(int time) {
            this.time = time;
        }

        public BigDecimal getResult() {
            return result;
        }

        public void setResult(BigDecimal result) {
            this.result = result;
        }

        @Override
        public String toString() {
            return "DataBean{" + "time=" + time + ", result=" + result + '}';
        }

    }

    public static class ChartData {

        private Integer time;
        private BigDecimal result;

        public ChartData(Integer time, BigDecimal result) {
            this.time = time;
            this.result = result;
        }

        public Integer getTime() {
            return time;
        }

        public BigDecimal getResult() {
            return result;
        }

        public void setTime(Integer time) {
            this.time = time;
        }

        public void setResult(BigDecimal result) {
            this.result = result;
        }

        @Override
        public String toString() {
            return "ChartData{" + "time=" + time + ", result=" + result + '}';
        }

    }

}


所以如果 ChartDataDataBean 的属性名称一致,你的代码可以这样写(就不用挨个属性的写 setter 方法了):

List<ChartData> data = getdata();
List<DataBean> yValue = new ArrayList<>(data.size());
for (ChartData item : data) {
    DataBean bean = new DataBean();
    BeanUtils.copyProperties(bean, item);
    yValue.add(bean);
}

当然,需要注意的一点是,这是使用反射实现的,效率要比直接写 setter 方法要低一些。

过去多啦不再A梦
List<DataBean> yValue = data.stream().map(item -> {
    DataBean bean = new DataBean();
    bean.setName(item.getResult());
    bean.setValue(item.getTime());
    return bean;
}).collect(Collectors.toList());
迷茫

强转只能父类转子类,你这就老实点一个个字段set过去就好了

阿神

楼主学习一下 Java 的类型转换啊。这种条件下,不能强转的。

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号