Cómo crear rápida y convenientemente una lista de arreglos de un elemento [duplicate]

8 minutos de lectura

avatar de usuario
david t

¿Hay algún método de utilidad en algún lugar que pueda hacer esto en 1 línea? no lo encuentro por ningun lado Collectionso List.

public List<String> stringToOneElementList(String s) {
    List<String> list = new ArrayList<String>();
    list.add(s);
    return list;
}

No quiero reinventar la rueda a menos que planee ponerle llantas elegantes.

Bueno… el tipo puede ser Ty no String. Pero usted consigue el punto. (con todas las comprobaciones nulas, comprobaciones de seguridad, etc.)

  • Bueno, no deberías usar ese método en absoluto. Los lugares donde está llamando al método, simplemente reemplace la llamada con la transformación de “línea única” que está buscando.

    – Rohit Jain

    3 de diciembre de 2013 a las 18:34

  • Quiero decir, quieres transformar todo dentro del método en una sola línea, ¿verdad? Bueno, entonces ese método realmente no está haciendo nada que no se pueda hacer sin él. Lo que harías es, return Arrays.asList(s);. Pero entonces, ¿cuál es el punto de ese método adicional? Es sólo actuar como un delegado. Solo quítalo. Y donde sea que llames stringToOneElementList(s)llamar Arrays.asList(s)eso es todo.

    – Rohit Jain

    03/12/2013 a las 18:40

  • oh vale, creo que entiendo. bueno, la única razón por la que tuve ese método fue porque no sabía dónde estaba ese “trazador de líneas mágico”. por lo tanto, es por eso que hice esta pregunta de stackoverflow en primer lugar. si ya supiera esa linea Arrays.asList(s), entonces, ¿por qué haría mi pregunta aquí en stackoverflow? Me sorprendió descubrir que este método de conveniencia está en matrices y no en colecciones.

    – david t

    3 de diciembre de 2013 a las 18:48

  • Arrays es una clase de utilidad que contiene varios otros métodos que puede utilizar de vez en cuando. La razón por la que este método en Arrays class es porque el método realmente está convirtiendo de array a un list. El método está definido para tomar var-args. Por lo tanto, cualquier argumento que le pase se convierte internamente solo en una matriz. Y luego se crea una lista a partir de ella. Entonces, ese es su lugar designado – Arrays.

    – Rohit Jain

    3 de diciembre de 2013 a las 18:51


  • el diseño en Java fue convertir CUALQUIER cantidad de cadenas en listas, lo que incluye solo 1 cadena (pero también significa que solo hay 1 forma de hacerlo). en otros idiomas hay más de una manera de hacer algo, así que solo quería saber la mejor manera (en este caso, solo 1 manera), por ejemplo, ruby, puedes decir “blah.first” y “blah.last “en lugar de como” blah[0]”, que es muy conveniente y más legible. En Java, ese no parece ser el caso. Lo siento, espero que haya tenido sentido

    – david t

    03/12/2013 a las 19:00

avatar de usuario
Elliot Frisch

Tamaño fijo List

La forma más fácil, que yo sepa, es crear un elemento único de tamaño fijo List con Arrays.asList(T...) me gusta

// Returns a List backed by a varargs T.
return Arrays.asList(s);

Tamaño variable List

Si necesita variar en tamaño, puede construir un ArrayList y el tamaño fijoList me gusta

return new ArrayList<String>(Arrays.asList(s));

y (en Java 7+) puede usar el operador de diamantes <> para hacerlo

return new ArrayList<>(Arrays.asList(s));

Lista de elementos individuales

Las colecciones pueden devolver una lista con un solo elemento y la lista es inmutable:

Collections.singletonList(s)

El beneficio aquí es que el análisis de código de IDE no advierte sobre las llamadas asList (…) de un solo elemento.

  • eso es EXACTAMENTE lo que estaba buscando. ¡gracias! No tengo idea de por qué esto está en matrices y no en listas, colecciones o lo que sea.

    – david t

    3 de diciembre de 2013 a las 18:45

  • Tenga cuidado con esta solución. No se puede modificar la Lista. Si intenta, por ejemplo, agregar elementos a esta lista, arrojará una excepción UnsupportedOperationException.

    – Adamsan

    28 de agosto de 2014 a las 9:33


  • Colecciones.singletonList(olmo); es más preferible ya que crea una lista inmutable.

    – Ravish Bhagdev

    3 de junio de 2015 a las 10:39

  • @RavishBhagdev – no siempre. Hay momentos en los que es posible que desee agregar cosas a la lista más adelante. De hecho, utilicé exactamente el enfoque de esta respuesta en un algoritmo de búsqueda de rutas en gráficos.

    – Proyecto Chthonic

    17/03/2016 a las 22:48

  • A partir de JDK9, habrá un método List.of​(E e1) que devuelve una lista inmutable (download.java.net/java/jdk9/docs/api/java/util/List.html#of-E-)

    – Nicolás

    25 de agosto de 2017 a las 10:25


avatar de usuario
Andrés

Collections.singletonList(object)

la lista creada por este método es inmutable.

  • IntelliJ IDEA recomienda automáticamente esto en lugar de Arrays.asList(object).

    – Matej

    15/10/2015 a las 13:36

  • Tenga en cuenta que la lista creada por este método es inmutable.

    – Mandar Pathak

    9 de agosto de 2016 a las 0:52

  • ¿Así que no te tomaste el tiempo de escribir una línea de las consecuencias de esta llamada? lista inmutable

    – Martín Asenov

    27 de agosto de 2018 a las 14:44

  • Por favor marque esto como una respuesta aceptada. Esto es mucho mejor que Arrays.asList.

    – Orri

    18 de octubre de 2018 a las 7:41

avatar de usuario
rgettman

Puedes usar el método de utilidad Arrays.asList y alimentar ese resultado en un nuevo ArrayList.

List<String> list = new ArrayList<String>(Arrays.asList(s));

Otras opciones:

List<String> list = new ArrayList<String>(Collections.nCopies(1, s));

y

List<String> list = new ArrayList<String>(Collections.singletonList(s));

Con Java 7+, puede usar el “operador de diamante”, reemplazando new ArrayList<String>(...) con new ArrayList<>(...).

Java 9

Si está usando Java 9+, puede usar el List.of método:

List<String> list = new ArrayList<>(List.of(s));

Independientemente del uso de cada una de las opciones anteriores, puede optar por no utilizar el new ArrayList<>() contenedor si no necesita que su lista sea mutable.

  • Me sorprende que seas el único en mencionar Collections.singletonList.

    – Jean-François Savard

    26 de mayo de 2015 a las 0:11

  • Estoy aún más sorprendido de que @AndyJ haya publicado Collections.singletonList después de mi comentario y obtuve 2 veces más votos que tu respuesta, que ya la tenía y está ahí desde hace 3 años… Siempre es divertido tropezar con comentarios antiguos.

    – Jean-François Savard

    20 mayo 2016 a las 16:47

  • No me sorprende que nadie más que usted haya mencionado List.of(s)

    – puño de hoja

    16 de marzo a las 7:42

Con flujos de Java 8:

Stream.of(object).collect(Collectors.toList())

o si necesita un conjunto:

Stream.of(object).collect(Collectors.toSet())

avatar de usuario
usuario167019

Las otras respuestas todas usan Arrays.asList()que devuelve una lista no modificable (un UnsupportedOperationException se arroja si intenta agregar o eliminar un elemento). Para obtener una lista mutable, puede envolver la lista devuelta en una nueva ArrayList como señalan un par de respuestas, pero una solución más limpia es usar guayaba Listas.nuevaArrayList() (disponible desde al menos guayaba 10publicado en 2011).

Por ejemplo:

Lists.newArrayList("Blargle!");

  • Esto no funciona si el elemento dado implementa Iterable, por ejemplo: Lists.newArrayList(Paths.get("/usr/local/this/is/not/single/element")); lo que desea es crear una matriz con un elemento de ruta única, sin embargo, lo que obtiene es una lista que contiene 7 elementos de ruta.

    – Beto

    6 de diciembre de 2016 a las 2:52


  • Ah, ya veo. Sí por defecto Java elegirá el método más específicoque en este caso es Lists#newArrayList(Iterable<? extends E> elements). Tu puedes hacer Lists.newArrayList(new Path[] {Paths.get("/usr/local/this/is/not/single/‌​element")}) para llamar explícitamente al método vararg, o simplemente construir una lista vacía (List<Path> p = Lists.newArrayList()) y agregue el elemento (p.add(Paths.get("/usr/local/this/is/not/single/‌​element"))).

    – usuario167019

    18 dic 2016 a las 20:33


avatar de usuario
SLaks

Muy simple:

Arrays.asList("Hi!")

  • Esto no funciona si el elemento dado implementa Iterable, por ejemplo: Lists.newArrayList(Paths.get("/usr/local/this/is/not/single/element")); lo que desea es crear una matriz con un elemento de ruta única, sin embargo, lo que obtiene es una lista que contiene 7 elementos de ruta.

    – Beto

    6 de diciembre de 2016 a las 2:52


  • Ah, ya veo. Sí por defecto Java elegirá el método más específicoque en este caso es Lists#newArrayList(Iterable<? extends E> elements). Tu puedes hacer Lists.newArrayList(new Path[] {Paths.get("/usr/local/this/is/not/single/‌​element")}) para llamar explícitamente al método vararg, o simplemente construir una lista vacía (List<Path> p = Lists.newArrayList()) y agregue el elemento (p.add(Paths.get("/usr/local/this/is/not/single/‌​element"))).

    – usuario167019

    18 dic 2016 a las 20:33


avatar de usuario
vegemite4me

Al ver que Guayaba recibe una mención, pensé que también sugeriría Colecciones de Eclipse (anteriormente conocido como GS Collections).

Los siguientes ejemplos devuelven un List con un solo artículo.

Lists.mutable.of("Just one item");
Lists.mutable.with("Or use with");
Lists.immutable.of("Maybe it must be immutable?");
Lists.immutable.with("And use with if you want");

Hay métodos similares para otras colecciones.

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad