2016-07-15 37 views
2

我試圖將下面的邏輯轉換爲可能使用Guava集合,並且無法確定哪一個最適合 - 過濾或轉換。即使多步驟如何確保哪些過濾發生在自己的列表上。使用Guava集合將自定義對象列表轉換爲另一個

​​

其中Detail只是一個具有長appId和Date createdOn的類。

甚至有可能將此特定邏輯轉換爲基於Guava的邏輯。

代碼說明:從Detail對象列表中,找到每個appId最近創建的對象。如果appId具有多個細節,那麼只選擇最新的細節。

只能使用Java 7的

+2

這真的不會作爲一個視圖集合,這是Guava提供內置的。這些操作中的任何一個都不能讓您以任何方式組合值。您目前的方法可能是Java 7以來的最佳方法。(如果您有Java 8,它可能會是一個不同的故事。) –

回答

3

我不認爲你可以使用過濾器在某種程度上改寫這個代碼或番石榴變換方法,但可以肯定是從其他番石榴方法中受益。

首先,使用Multimaps.index(Iterable<V> values, Function<? super V, K> keyFunction)方法,你可以清楚地表明,要打破detailList到集合的數量由APPID:

Multimap<Integer, Detail> detailsByAppId = Multimaps.index(detailList, 
     new Function<Detail, Integer>() { 
      @Override 
      public Integer apply(Detail detail) { 
      return detail.getAppId(); 
      } 
     } 
); 

然後你就可以通過這個集合的集合的迭代,找到最新詳細他們每個人:

List<Detail> latestDetails = new ArrayList<Detail>(); 
for (Collection<Detail> detailsPerAppId : detailsByAppId.asMap().values()) { 
    Detail latestDetail = Collections.max(detailsPerAppId, new Comparator<Detail>() { 
    @Override 
    public int compare(Detail d1, Detail d2) { 
     return d1.getCreatedOn().compareTo(d2.getCreatedOn()); 
    } 
    }); 
    latestDetails.add(latestDetail); 
} 
return latestDetails; 
+0

好的答案。但是如果你爲'Function'和'Comparator'使用lambda表達式而不是匿名類,那麼你的代碼會更短,更清晰和更優雅。比較器也可以寫成'Comparator.comparing(Detail :: getCreatedOn)'。 – Lii

+0

@你是對的,但問題的作者沒有提到他使用的是什麼版本的java,並且想要使用Guava中的過濾器或轉換方法而不是Stream API,所以我假設他使用Java 6或7。 –

+1

不幸的是,我只能使用Java 7,看起來這是我能得到的唯一的答案。 –

相關問題