繁体   English   中英

转换清单 <Object> 列出 <CustomClass> 在Java 8中

[英]Convert List<Object> to List<CustomClass> in Java 8

我有课:

public class BusinessUnit 
{
    private String name;

  //getter 
  //setter
}

我从服务中获取List<Object> ,我需要将其转换为List<BusinessUnit> 数据将仅是名称。 但是服务正在将我还给我。 在Java 8中进行此转换的最佳方法是什么

你的意思是 :

List<Object> list = ...
List<BusinessUnit> result = list.stream()
        .map(name -> new BusinessUnit((String) name))
        .collect(Collectors.toList());

我假设您在BusinessUnit中有一个采用neme的构造函数:

public class BusinessUnit {
    private String name;

    public BusinessUnit(){}

    public BusinessUnit(String name){
       this.name = name;
    }

    //getter 
    //setter
}
List<BusinessUnit> units = list.stream().map(BusinessUnit.class::cast).collect(Collectors.toList());

如果您确定对象是BusinessUnit,则最好的方法是esle,或者可以创建转换方法,然后在其中检查object instanceof BusinessUnit ,等等。

是Class.java中的方法

如果某个对象是字符串,您也可以

List<A> a = `list.stream().map(String.class::cast).map(BusinessUnit::new).collect(Collectors.toList());`

当然,您应该具有接受一个String的单个BusinessUnit构造函数。

对于此实例BusinessUnit::new ,否则您可以编写如下内容

.map(s -> new BusinessUnit(...))

更新

您还可以过滤对象列表filter(String.class::isInstance) ,然后使用map。

看看Class.java方法,有很多有趣而有用的方法。

如果您知道所有元素都是String ,则可以将服务的结果强制转换为List<String>

List<String> list = (List<String>) service.getData(...);   

而且,您还应该尝试更改服务代码以使其声明List<String>而不是原始的List: ListList<Object>这样您就可以直接将String映射到BusinessUnit

List<BusinessUnit> businessUnits =
   list.stream()
       .map(BusinessUnit::new)
       .collect(Collectors.toList));

BusinessUnit::new是一个BusinessUnit构造函数,它接受一个String作为@YCF_L的很好的答案。

但是,如果某些元素可能不是String对象,并且您想排除它们(以及为什么不记录信息),则您应该做些不同的事情。

在这种情况下,保持List<Object>不是一个选择:

List<Object> list = service.getData(...);   

您应该过滤不符合要求的元素。 例如,在这里我删除null而不是String对象:

List<BusinessUnit> businessUnits =
   list.stream()           
       .map(o -> {
                if (!(o instanceof String)){ 
                   logger.warn(o + "is not a String or is null"); 
                   return null;
                 }
                 return (String) o;
            }
        )
       .filter(Objects::nonNull)
       .collect(Collectors.toList));

因为您的服务没有返回字符串,所以您必须遍历列表并将它们转换为BusinessUnit类

List<BusinessUnit> businessUnits = list.stream()
.map(object -> new BusinessUnit(object.toString()))
.collect(Collectors.toList());

在您的BusinessUnit类中更新您的构造方法

public BusinessUnit(String object){
this.name = object;
}

我希望这行得通

您可以通过Java 8 Stream概念来实现:

List<BusinessUnit> units = businessUnitsAsObjects.stream()
    .map(BusinessUnit.class::cast)
    .collect(Collectors.toList());

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM