2009-11-11 9 views
5

Angenommen, eine Klasse (z. B. URI), die mithilfe des Konstruktors und der toString() -Methode in und aus einem String konvertiert werden kann.Java Collection einer Klasse in Collection of String konvertieren

Ich habe eine ArrayList<URI> und ich möchte es auf eine ArrayList<String> kopieren, oder umgekehrt.

Gibt es eine Dienstprogrammfunktion in der Java-Standardbibliothek, die das tut? Etwas wie:

java.util.collections.copy(urlArray,stringArray);

Ich weiß, es gibt Dienstprogramm-Bibliotheken, die diese Funktion bieten, aber ich möchte nicht eine unnötige Bibliothek hinzuzufügen.

Ich weiß auch, wie man eine solche Funktion schreibt, aber es ist ärgerlich, Code zu lesen und zu finden, dass jemand Funktionen geschrieben hat, die bereits in der Standardbibliothek existieren.

Antwort

4

Nein, es gibt keine Standard-JDK-Verknüpfung, um dies zu tun.

+0

Es würde eine Parallel-Array-Transformationsfunktion im Fork-Join-Framework von JDK7 geben, aber all diese Dinge wurden aufgrund mangelnder Übereinstimmung (IIRC) entfernt. –

+0

... und das ist eines der Probleme bei der konsensbasierten Standardherstellung :-( –

0

Da zwei Arten von Sammlungen möglicherweise nicht kompatibel sind, gibt es keine integrierte Methode zum Konvertieren einer typisierten Sammlung in eine andere typisierte Sammlung.

2

Werfen Sie einen Blick auf commons-Sammlungen:

http://commons.apache.org/collections/

Ich glaube, dass CollectionUtils ein Verfahren verwandeln hat.

+0

Vermutlich hat die Google Collection Bibliothek etwas ähnliches. –

+0

Sorry, nur gesehen, dass Sie keine zusätzlichen Bibliotheken hinzufügen wollten. – Eric

5

Ich weiß, dass Sie keine weiteren Bibliotheken hinzufügen möchten, sondern für jeden, der diese von einer Suchmaschine, in Google-Sammlungen, die Sie vielleicht Verwendung findet:

List<String> strings = Lists.transform(uris, Functions.toStringFunction()); 

einen Weg, und

List<String> uris = Lists.transform(strings, new Function<String, URI>() { 
    public URI apply(String from) { 
    try { 
     return new URI(from); 
    } catch (URISyntaxException e) { 
     // whatever you need to do here 
    } 
    } 
}); 

der andere.

0

Versuchen:

public ArrayList<String> convert(ArrayList<URI> source) { 
    ArrayList<String> dest=new ArrayList<String>(); 

    for(URI uri : source) 
     dest.add(source.toString()); 

    return dest; 
} 

Im Ernst, wäre eine eingebaute API viel das bieten?

Auch nicht sehr OO. Das URI-Array sollte wahrscheinlich in eine Klasse eingebunden sein. Die Klasse könnte eine .asStrings() -Methode haben.

Außerdem werden Sie wahrscheinlich feststellen, dass Sie die String-Collection-Version nicht einmal benötigen (oder gar wollen), wenn Sie Ihre URI-Klasse korrekt schreiben. Vielleicht möchten Sie nur eine getAsString (int index) -Methode oder eine getStringIterator() -Methode für Ihre URI-Klasse, dann können Sie Ihre URI-Klasse an jede Methode übergeben, an die Sie Ihre String-Sammlung übergeben möchten.

+0

Eigentlich ist das SEHR OO. Du machst es die ganze Zeit in dynamisch-typisierten Sprachen wie JavaScript und Python. Static Typing ist keine Voraussetzung für OO. Ich könnte am Ende eine convert() -Funktion wie Ihre schreiben, aber es wird Generika nehmen."String" ist ein Sonderfall unter den eingebauten Typen: Jedes Objekt hat eine toString() -Methode, aber es ist nicht erforderlich, dass "MyClass newObj = new MyClass (oldObj.toString());" Erhalte ein Objekt wie newObj.equals (oldObj). In Python macht das die "__repr__" -Methode, und in JavaScript können Sie alles in JSON und zurück konvertieren. –

+0

Eigentlich ist das Nicht-Oo-Problem nicht, dass es kein Typ ist, sondern dass das, was ich oben geschrieben habe, keine Methode ist, sondern eine Funktion. Auf einer grundlegenden Ebene, wenn Sie Funktionen anstelle von Methoden schreiben, patchen Sie entweder etwas, das Sie nicht machen können (wegen bereits existierendem Code) oder Sie tun es falsch. –

+0

(Übrigens wollte ich damit nicht so absolut klingen. Es gibt Ausnahmen - wie wiederverwendbare Utility-Funktionen wie diese - aber in der Regel sollten sogar die Ausnahmen in Business-Klassen irgendwann sein). Wie dem auch sei, der Punkt ist, dass die Objekt-API, die Sie dem Rest Ihres Systems an irgendeinem Punkt zur Verfügung stellen, auf Geschäftslogik-Klassen und nicht auf Utility-Funktionen und Sammlungen basieren sollte, da diese nicht zu einer anständigen API gemacht werden können, egal wie hart Sie sind Versuchen. –