2009-11-11 11 views
5

Assumendo una classe (ad esempio URI) convertibile in una stringa utilizzando il metodo constructor e toString().Conversione di una raccolta Java di una classe in una raccolta di stringhe

Ho un ArrayList<URI> e voglio copiarlo su un ArrayList<String>, o viceversa.

Esiste una funzione di utilità nella libreria standard Java che lo eseguirà? Qualcosa di simile:

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

So che ci sono le librerie di utilità che forniscono tale funzione, ma io non voglio aggiungere una libreria inutile.

So anche come scrivere una tale funzione, ma è fastidioso leggere il codice e scoprire che qualcuno ha scritto funzioni che già esistono nella libreria standard.

risposta

4

No, non esiste un collegamento JDK standard per eseguire questa operazione.

+0

Ci sarebbe stata una funzione di trasformazione dell'array parallelo nel framework fork-join di JDK7, ma tutte le cose sono state rimosse a causa della mancanza di accordo (IIRC). –

+0

... e questo è uno dei problemi con la creazione standard basata sul consenso :-( –

0

Poiché due tipi di raccolte potrebbero non essere compatibili, non esiste un metodo incorporato per convertire una raccolta tipizzata in un'altra raccolta tipizzata.

2

Dai un'occhiata alla Commons-collezioni:

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

Credo che CollectionUtils ha un metodo transform.

+0

Presumibilmente la raccolta di google ha qualcosa di simile –

+0

scusa, ho appena visto che non volevi aggiungere altre librerie – Eric

5

So che non vuoi aggiungere librerie aggiuntive, ma per chi trova questo da un motore di ricerca, in google-collezioni è possibile utilizzare:

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

in un modo, e

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 
    } 
    } 
}); 

l'altro.

0

Prova:

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

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

    return dest; 
} 

Scherzi a parte, sarebbe un built-in API offrire molto a che?

Inoltre, non molto OO. l'array URI dovrebbe essere probabilmente racchiuso in una classe. La classe potrebbe avere un metodo .asStrings().

Inoltre, probabilmente non avrai nemmeno bisogno (o nemmeno vuoi) della versione di raccolta String se scrivi correttamente la tua classe URI. Potresti semplicemente voler un metodo getAsString (int index) o un metodo getStringIterator() sulla tua classe URI, quindi puoi passare la tua classe URI in qualunque metodo tu stia per passare la tua collezione di stringhe a.

+0

In realtà questo è MOLTO OO. Lo fai sempre in linguaggi digitati dinamicamente come JavaScript e Python. La tipizzazione statica non è un requisito di OO. Potrei finire per scrivere una funzione convert() come la tua, ma ci vorranno i generici."String" è un caso speciale tra i tipi built-in: ogni Object ha un metodo toString() ma non è richiesto "MyClass newObj = new MyClass (oldObj.toString());" fornire un oggetto tale che newObj.equals (oldObj). In Python il metodo "__repr__" lo fa, e in JavaScript puoi convertire qualsiasi cosa in JSON e viceversa. –

+0

In realtà il problema non-oo non è che non è un tipo, è che quello che ho scritto sopra non è un metodo, è una funzione. A livello di base, se stai scrivendo le funzioni al posto dei metodi, stai tagliando qualcosa che non puoi rendere OO (a causa del codice preesistente) o stai sbagliando. –

+0

(A proposito, non volevo che suonasse in modo così assoluto. Ci sono delle eccezioni, come funzioni di utilità riutilizzabili come questa - ma a volte le eccezioni dovrebbero essere all'interno delle business class). Ad ogni modo, il punto è che l'API dell'oggetto che fornisci al resto del tuo sistema, in qualsiasi momento, dovrebbe essere basata su classi logiche di business e non su funzioni e raccolte di utilità perché queste non possono essere trasformate in un'API decente, non importa quanto tu sia difficile provare. –

Problemi correlati