2015-06-23 100 views
2

我有,我想重構用java 8流API功能的Java 8流和lambda表達式

Map<String, Object> user = ...// pull user from somewhere 
List<Map<String, Object>> attributes = ...// pull attributes from somewhere 
List<Map<String, Object>> processedAttributes = new ArrayList<>(); 
    for (Map<String, Object> attribute : attributes) { 
     if (!((List<Map<String, Object>>) attribute.get("subAttributes")).isEmpty()) { 
      for (Map<String, Object> subAttribute : (List<Map<String, Object>>) attribute.get("subAttributes")) { 
       if (!user.containsKey(subAttribute.get("name")) 
         && Boolean.TRUE.equals(subAttribute.get("required"))) { 
        processedAttributes.add(subAttribute); 
       } 
      } 
     } 
    } 

這又如何使用Java 8流進行重構,代碼非常有趣的一部分嗎?

+2

用'iterable.forEach(x - >語句)'替換'(iterable)',用'iterable.filter(x - > condition)'替換''。看着這個循環,這個陳述將會很長。 – RogueCSDev

+1

你也可以使用'map'和'filter(List :: isEmpty)'。 – tly

+0

有趣的問題。你認爲你可以在Stream Stream API中讀一下,想出一個解決方案嗎?如果你遇到困難,我們可以幫助你?或者這是一個編碼請求? – CKing

回答

3

這可以通過非常簡單的方式使用flatMap被改寫:

List<Map<String, Object>> processedAttributes = attributes.stream() 
     .flatMap(
       attribute -> ((List<Map<String, Object>>) attribute 
         .get("subAttributes")).stream()) 
     .filter(subAttr -> !user.containsKey(subAttr.get("name")) 
       && Boolean.TRUE.equals(subAttr.get("required"))) 
     .collect(Collectors.toList()); 

注意isEmpty檢查是在你的代碼不必要的:如果List爲空,則for循環將不執行反正。