2015-05-14 128 views
1

好吧,我有一個地圖列表,我想過濾然後收集到另一個地圖列表。每次我通過這個過程放入List時,我都會得到一個對象列表...幫助?!Java 8過濾和收集列表<Map <String,Object >>

List<Map<String, Object>> segments = (List<Map<String, Object>>) (List<?>) query.getResultList(); 

List<Map<String, Object>> segmentsWithMoreVersions = segments.stream() 
      .filter((Object s) -> { 
       Object[] ss = (Object[]) s; 
       if(((Long) ss[2]) == 1) 
       { 
        return false; 
       } 
       return true; 
      }) 
      .collect(Collectors.toList()); 

正如你可以看到... ...在過濾方法我已經使用的對象,因爲我不能得到的s變量是一個地圖。當我嘗試時,我得到一個ClassCastException。

編輯:好的,需要也許更多信息... 所以我segments變量是像這樣:

[ 
    {'name': 'ABC', 'version': 1, 'ct': 1}, 
    {'name': 'AAA', 'version': 1, 'ct': 1}, 
    {'name': 'BFD', 'version': 1, 'ct': 4}, 
    {'name': 'SDE', 'version': 1, 'ct': 1} 
] 

我想要做的是過濾掉所有具有克拉的地圖1. 過濾方法正在查看該對象(因爲我無法將其轉換爲Map)並檢查它是否爲1,如果是,它不會將其返回給流。

EDIT2:的意見後,我編輯以下幾點:

List<Map<String, Object>> segmentsWithMoreVersions = segments.stream() 
      .filter(m -> ((Long) m.get("ct")) != 1L) 
      .collect(Collectors.toList()); 

而且我得到以下幾點:Caused by: java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to java.util.Map

+1

你需要向我們解釋'過濾器'應該做什麼。這沒有任何意義。 – Radiodef

+0

我不明白? 'filter'正在過濾List ...什麼沒有意義? – BoxMan0617

+1

當你在'segments.stream()'上調用'filter'時,你需要傳遞一個'Predicate >'。你傳遞給它一個'Predicate '並試圖將一個'Map'投射到一個數組。然後將該數組的元素轉換爲「Long」。這沒有任何意義。所以,請解釋你打算做什麼。 – Radiodef

回答

0

好的...所以,問題不在於過濾功能。感謝@ Radiodef指出未經檢查的轉換,我發現這是導致問題的原因。所以我做的是改變到這個:

List<?> tmp = query.getResultList(); 
    List<Map<String, Object>> segments = new ArrayList<Map<String, Object>>(); 
    for(Object t : tmp) 
    { 
     Object[] tt = (Object[]) t; 
     Map<String, Object> rMap = new HashMap<String, Object>(); 
     rMap.put("name", tt[0]); 
     rMap.put("version", tt[1]); 
     rMap.put("ct", tt[2]); 
     segments.add(rMap); 
    } 

從那裏的filter工作!多謝你們!

4

因此,根據您的描述,我覺得你想要的過濾器是這樣的:

segments.stream() 
     .filter(m -> ((Long) m.get("ct")) != 1L) 
     .collect(toList()); 

或被明確有關謂詞的類型:

 .filter((Map<String, Object> m) -> 
        ((Long) m.get("ct")) != 1L) 

關於您的編輯:您在地圖中有錯誤的數據,或者您誤解了它的表示方式。看起來segments實際上是List<Object[]>

我沒有足夠的信息來幫助您解決問題。

要嘗試調試,你可以這樣做:

segments.stream() 
     .map(Arrays::toString) 
     .forEach(System.out::println); 

這會告訴你什麼是真正的,如果你沒有文件提及。

+0

好吧,我把它改爲: 名單<地圖<字符串,對象>> segmentsWithMoreVersions = segments.stream() \t \t \t \t .filter(M - >((長)m.get( 「CT」))! = 1L) \t \t \t \t .collect(Collectors.toList()); 而我得到的異常:'引起:java.lang.ClassCastException:[Ljava.lang.Object;不能轉換爲java.util.Map' – BoxMan0617

0

這對我的作品......

List<Map<String, Object>> segments = new ArrayList<Map<String, Object>>(); 

    List<Map<String, Object>> segmentsWithMoreVersions = segments.stream() 
      .filter((Map<String, Object> s) -> { 
       return (Long) s.get("versions") > 1; 
      }) 
      .collect(Collectors.toList()); 
相關問題