2016-07-15 28 views
2

Ich versuche, dies unter Logik zu konvertieren, um möglicherweise Guava-Sammlungen zu verwenden und kann nicht herausfinden, welche am besten passt - Filter oder Transform. Selbst wenn Sie mehrere Schritte ausführen, stellen Sie sicher, dass die Liste, in der die Filterung stattfindet, auf sich selbst aufbaut.Transformieren/Filtern einer Liste von benutzerdefinierten Objekten zu einem anderen mit Guava-Sammlungen

Wo Detail ist nur eine Klasse mit Long appId und Date createdOn.

Ist es überhaupt möglich, diese spezifische Logik in eine Guava-basierte umzuwandeln?

Erläuterung des Codes: Suchen Sie in der Liste der Detailobjekte die zuletzt erstellten Objekte pro appId. Wenn eine appId mehrere Details enthält, wählen Sie nur die neueste aus.

Kann verwenden nur Java 7

+2

Dies wird wirklich nicht als eine Ansicht Sammlung arbeiten, die Guava bietet eingebaut ist. Mit keiner dieser Operationen können Sie Werte beliebig kombinieren. Ihr derzeitiger Ansatz ist wahrscheinlich der beste, der seit Java 7 verfügbar ist. (Wenn Sie Java 8 haben, könnte das eine andere Geschichte sein.) –

Antwort

3

Das glaube ich nicht, dass Sie irgendwie diesen Code-Filter neu schreiben können oder Methoden von Guava verwandeln, aber man kann sicherlich von anderen Guava Methoden profitieren.

Zunächst einmal mit Multimaps.index(Iterable<V> values, Function<? super V, K> keyFunction) Methode, die Sie klar nachweisen können, dass Sie Detaillist in Anzahl von Sammlungen von appId brechen wollen:

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

Dann können Sie durchlaufen diese Sammlung von Sammlungen und finden Sie die neueste Detail in Jeder von ihnen:

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

Schöne Antwort. Aber Ihr Code wäre viel kürzer, klarer und eleganter, wenn Sie Lambda-Ausdrücke anstelle von anonymen Klassen für Ihre 'Funktion' und' Comparator' verwenden würden. Der Komparator könnte auch 'Comparator.comparing (Detail :: getCreatedOn)' geschrieben werden. – Lii

+0

@Lii Sie haben Recht, aber der Autor der Frage nicht erwähnt, welche Version von Java er verwendet und Filter oder Transform-Methoden von Guava anstelle von Stream-API verwenden wollte, so nahm ich an, er verwendet Java 6 oder 7. –

+1

Leider kann ich nur Java 7 verwenden und scheint, das ist die einzige enge Antwort, die ich bekommen kann. –