我上课:
public class BusinessUnit
{
private String name;
//getter
//setter
}
我正在从服务中获得List<Object>
,我需要将其转换为List<BusinessUnit>
。数据将仅是名称。但是服务正在将我还给我。在Java 8中进行此转换的最佳方法是什么
答案 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>
而不是原始列表:List
或List<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));
答案 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());