2017-07-24 32 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(); 
相關問題