2017-07-24 34 views
1

我有一个不同类的HashMap,它具有与每个键相关的不同属性。我正在使用Java 8的stream() API来合并基于属性的列表。我的目标是迭代综合列表,根据类创建一个对象,并使用该接口为每个对象调用方法。使用相同的实现从数组列表中创建对象

我在合并后创建这些对象时遇到问题。这里是我的代码:

private static final HashMap<Class<? extends DataAssessment>, Integer> TYPE_DATA_ASSESSMENT = new HashMap<Class<? extends DataAssessment>, Integer>() {{ 
    put(AsertUsed.class, Definitions.DATA_TYPES.ELF); 
    put(ShellDeleted.class, Definitions.DATA_TYPES.ELF); 
    put(ShellUsed.class, Definitions.DATA_TYPES.ELF); 
}}; 

在我的switch语句:

List<Class<?>> assessmentType = TYPE_DATA_ASSESSMENT.entrySet() 
                .stream() 
                .filter(item -> item.equals(Definitions.DATA_TYPES.ELF)) 
                .map(Map.Entry::getKey) 
                .collect(Collectors.toList()); 

for(int i = 0; i < assessmentType.size(); i++) 
{ 
    // This is where I am stuck 
    // 
    DataAssessment assessment = new (DataAssessment) assessmentType.get(i); 
} 
+4

你可能想'Class.newInstance()' – 2017-07-24 19:46:32

+0

什么对象创建的一部分失败的原因?它看起来像1)你可能有一个不必要的'new'和2)你的'for'循环只是一遍又一遍覆盖同一个'DataAssessment'变量,因此不会保存你创建的对象 – MyStackRunnethOver

+0

调用构造函数参数与反射https://stackoverflow.com/questions/3574065/instantiate-a-class-object-with-constructor-that-accepts-a-string-parameter – lucasvw

回答

1

这应该工作

DataAssessment assessment = (DataAssessment) assessmentType.get(i).newInstance(); 
+0

这对我正在使用的一个例子有效。我去实现这个,但很快意识到我正在使用一个构造函数。我已经尝试了几个变种,将构造函数暴露给newInstance(),但没有运气。具体来说,'getDeclaredConstructors()'和'getConstructors()'没有看到这些类的内部构造函数 - 尽管参数对于每个类都是相同的。 – user0000001

+0

@ user0000001你应该更新你的问题来包含一个你需要使用的构造函数,这样我们就可以看到你想要的。 – lucasvw

0

如何做收集流之前投?

List<DataAssessment> assessmentType = 
       TYPE_DATA_ASSESSMENT.entrySet().stream() 
               .filter(item -> item.equals(Definitions.DATA_TYPES.ELF)) 
               .map(Map.Entry :: getKey) 
               .map(x -> (DataAssessment) x) 
               .collect(Collectors.toList(); 
相关问题