在Java 8中将List <object>转换为List <customclass>

时间:2018-07-22 11:09:39

标签: java java-8

我上课:

public class BusinessUnit 
{
    private String name;

  //getter 
  //setter
}

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

5 个答案:

答案 0 :(得分:3)

您的意思是:

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

我假设您在BusinessUnit中有一个构造函数,该构造函数有一个尼姆:

public class BusinessUnit {
    private String name;

    public BusinessUnit(){}

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

    //getter 
    //setter
}

答案 1 :(得分:1)

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

如果您确定Object是BussinessUnit,或者是esle,则可以使用它来创建演员表方法,然后检查object instanceof BusinessUnit等等,这是最好的方法。

cast是Class.java中的方法

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

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

当然,您应该具有接受一个String的单个BusinessUnit构造函数。 对于此实例BussinesUnit::new,否则您可以编写类似的内容

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

已更新

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

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

答案 2 :(得分:1)

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

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

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

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

其中BusinessUnit::newBusinessUnit的构造函数,它接受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));

答案 3 :(得分:0)

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

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

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

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

我希望这行得通

答案 4 :(得分:0)

您可以通过Java 8 Stream概念实现这一目标:

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