Para mantener el código mínimo, quiero poder crear una lista de un objeto personalizado en java. Similar a lo que hacemos en C# o Swift , donde definimos el constructor o los parámetros de la lista de esa manera, no tenemos que crear un objeto y un constructor separados para la lista.
Por ejemplo
var menuList: [(category: String, name: String, ismulti: Bool)] = [ (category: "Categ1", name: "name1", ismulti: true), (category: "Categ2", name: "name2", ismulti: false), (category: "Categ3", name: "name3", type: ismulti: true), ] Aquí var menuList: [(category: String, name: String, ismulti: Bool)] redujo la necesidad de un objeto y un constructor. ¿Hay algo similar en Java?
por lo mismo que hice en java.
public class Menu{ String category; String name; boolean isMulti; public Menu(String category, String name, boolean isMulti) { this.category = category; this.name = name; this.isMulti = isMulti; } public List<Menu> menuList = new ArrayList<Menu>() {{ add(new Menu("categ1","name1",true)); add(new Menu("categ2","name2",true)); add(new Menu("categ3","name3",true)); }}; }Vale la pena mencionar cuál es esta sintaxis:
public List<Menu> menuList = new ArrayList<Menu>() {{ add(new Menu("categ1","name1",true)); add(new Menu("categ2","name2",true)); add(new Menu("categ3","name3",true)); }}Esto se llama - "inicialización de doble llave" y bajo el capó extiende de forma anónima la clase ArrayList, generalmente debe usarse con precaución, puede leer más aquí
Volviendo a la pregunta original: dependiendo de lo que necesite, qué versión de Java esté usando y si puede/quiere usar algunas bibliotecas externas, tiene estas opciones, tenga en cuenta que Arrays.asList() y List.of() regresan una lista que no soporta todas las operaciones, como add() o remove() y en el último caso, también set() . También con respecto al constructor, como otros ya mencionaron, podría usar el proyecto Lombok para generar un constructor para usted:
List<Menu> collect = List.of( new Menu("categ1","name1",true), new Menu("categ2","name2",true), new Menu("categ3","name3",true)); List<Menu> collect = Stream.of( new Menu("categ1","name1",true), new Menu("categ2","name2",true), new Menu("categ3","name3",true)) .collect(Collectors.toList()); List<Menu> collect = Arrays.asList( new Menu("categ1", "name1", true), new Menu("categ2", "name2", true), new Menu("categ3", "name3", true));Guava es una biblioteca externa, véala aquí .
List<Menu> collect = Lists.newArrayList( new Menu("categ1","name1",true), new Menu("categ2","name2",true), new Menu("categ3","name3",true));Alternativamente, podría escribir su propia clase como lo hizo @ernest_k, lo que realmente le brinda una gran flexibilidad cuando trabaja con diferentes tipos.
Solo para agregar una tercera solución (como han señalado las otras respuestas, no puede hacer esto en Java, no existe tal sintaxis).
Una cosa que puede hacer es crear su propia clase Tuple reutilizable . Se verá obligado a tener una clase por número de elementos, pero puede reutilizarla con varias combinaciones de tipos.
static class Tuple3<T, U, V> { final T _1; final U _2; final V _3; private Tuple3(T t, U u, V v) { this._1 = t; this._2 = u; this._3 = v; } public static <T, U, V> Tuple3<T, U, V> of(T t, U u, V v) { return new Tuple3<>(t, u, v); } }Luego (con la misma clase de tupla, puede tener diferentes sabores de esto):
//menuList is a List<Tuple3<String, String, Boolean>> var menuList = List.of( Tuple3.of("Categ1", "name1", true), Tuple3.of("Categ2", "name2", false), Tuple3.of("Categ3", "name3", true) ); //registration is a List<Tuple3<String, LocalDate, Double>> var registrationData = List.of( Tuple3.of("John", LocalDate.EPOCH, 1.1), Tuple3.of("James", LocalDate.now(), 2.2), Tuple3.of("Ron", LocalDate.now(), 3.3) ); Personalmente, haría públicos los campos _1 , _2 y _3 , pero esto es una preferencia. Puede crear getters para ellos si lo prefiere (quizás _1() pero no puede ser lo suficientemente limpio).
Supongo que Java 11+, pero puede hacerlo fácilmente compatible con versiones anteriores simplemente eliminando var y List.of
Podría usar Lombok para generar el constructor por usted. Eso realmente no resuelve su problema, pero al menos tiene un código más corto.
Y podría usar el operador de diamante para new ArrayList<>() o usar Arrays.asList() para crear una nueva Lista.
@AllArgsConstructor public class Menu { String category; String name; boolean isMulti; public List<Menu> menuList = List.of( // if Java < 9, use Arrays.asList() new Menu("categ1", "name1", true), new Menu("categ2", "name2", true), new Menu("categ3", "name3", true) ); }