2009-11-11 9 views
5

Supongamos una clase (por ejemplo URI) que se puede convertir desde y hacia una cadena usando el constructor y el método toString().Conversión de Java Collection de alguna clase a Collection of String

Tengo un ArrayList<URI> y quiero copiarlo en un ArrayList<String>, o al revés.

¿Hay alguna función de utilidad en la biblioteca estándar de Java que lo haga? Algo así como:

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

Sé que hay librerías de utilidades que proporcionan esa función, pero no quiero añadir una biblioteca innecesaria.

También sé cómo escribir esa función, pero es molesto leer el código y descubrir que alguien ha escrito funciones que ya existen en la biblioteca estándar.

Respuesta

4

No, no hay un atajo JDK estándar para hacer esto.

+0

Hubo una función de transformación de matriz paralela en el marco de unión por horquilla de JDK7, pero todo eso se eliminó debido a la falta de acuerdo (IIRC). –

+0

... y ese es uno de los problemas con la creación de estándares basados ​​en consenso :-( –

0

Dado que dos tipos de colecciones pueden no ser compatibles, no hay un método incorporado para convertir una colección escrita a otra colección escrita a máquina.

2

Tenga una mirada en Commons-colecciones:

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

creo que CollectionUtils tiene un método de transformación.

+0

Probablemente la biblioteca de colección de google tiene algo similar. –

+0

lo siento, acabo de ver que no quería agregar bibliotecas adicionales. – Eric

5

Sé que no desea añadir bibliotecas adicionales, pero para cualquier persona que encuentre esto desde un motor de búsqueda, en Google-colecciones que podría utilizar:

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

una manera, y

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

el otro.

0

Probar:

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

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

    return dest; 
} 

serio, habría una API incorporado ofrecer mucho a eso?

Además, no muy OO. la matriz URI probablemente debería estar envuelta en una clase. La clase puede tener un método .asStrings().

Además, probablemente encontrará que ni siquiera necesita (o incluso desea) la versión de la colección de cadenas si escribe correctamente su clase de URI. Es posible que solo desee un método getAsString (índice interno) o un método getStringIterator() en su clase URI, luego puede pasar su clase URI al método que iba a pasar su colección de cadenas.

+0

En realidad, esto es MUY OO. Lo haces todo el tiempo en lenguajes de tipado dinámico como JavaScript y Python. La tipificación estática no es un requisito de OO. Puedo terminar escribiendo una función de conversión() como la tuya, pero tomará genéricos."Cadena" es un caso especial entre los tipos incorporados: cada Objeto tiene un método toString(), pero no es necesario que "MyClass newObj = new MyClass (oldObj.toString());" ceda un objeto tal que newObj.equals (oldObj). En Python, el método "__repr__" hace eso, y en JavaScript puede convertir cualquier cosa a JSON y viceversa. –

+0

En realidad, el problema no es que no es un tipo, es que lo que escribí anteriormente no es un método, es una función. En un nivel básico, si está escribiendo funciones en lugar de métodos, está parcheando algo que no puede hacer OO (debido a un código preexistente) o lo está haciendo mal. –

+0

(Por cierto, no quise que parezca tan absoluto. Hay excepciones, como funciones de utilidad reutilizables como esta, pero la mayoría de las veces las excepciones deberían estar dentro de las clases de negocios en algún momento). De todos modos, el punto es que la API objeto que proporcionas al resto de tu sistema, en cualquier punto, debe basarse en clases de lógica de negocios y no en funciones y colecciones porque no se pueden convertir en una API decente sin importar cuánto te esfuerces tratar. –