Eu queria criar uma lista de opções para fins de teste. No começo, eu fiz isso:
ArrayList<String> places = new ArrayList<String>();
places.add("Buenos Aires");
places.add("Córdoba");
places.add("La Plata");
Em seguida, refatorei o código da seguinte maneira:
ArrayList<String> places = new ArrayList<String>(
Arrays.asList("Buenos Aires", "Córdoba", "La Plata"));
Existe uma maneira melhor de fazer isso?
java
collections
arraylist
initialization
Macarse
fonte
fonte
ArrasyList<String> places = ["Buenos Aires", "Córdoba", "La Plata"]
Respostas:
Na verdade, provavelmente a melhor "maneira" de inicializar
ArrayList
é o método que você escreveu, pois não precisa criar um novo deList
forma alguma:O problema é que há bastante digitação necessária para se referir a essa
list
instância.Existem alternativas, como criar uma classe interna anônima com um inicializador de instância (também conhecido como "inicialização entre chaves"):
No entanto, não gosto muito desse método, porque o que você acaba
ArrayList
criando é uma subclasse com um inicializador de instância e essa classe é criada apenas para criar um objeto - isso me parece um pouco exagerado.O que seria bom seria se a proposta da Collection Literals para o Project Coin fosse aceita (ela deveria ser introduzida no Java 7, mas também não é provável que faça parte do Java 8).
Infelizmente, não o ajudará aqui, pois inicializará um imutável em
List
vez de umArrayList
e, além disso, ainda não está disponível, se for o caso.fonte
Seria mais simples se você o declarasse apenas como
List
- precisa ser um ArrayList?Ou se você tiver apenas um elemento:
Isso significa que
places
é imutável (tentar alterá-lo fará com que umaUnsupportedOperationException
exceção seja lançada).Para criar uma lista mutável que seja concreta,
ArrayList
você pode criar uma aArrayList
partir da lista imutável:fonte
ArrayList
, seria melhor projetar alterar a declaração paraList
. Especifique interfaces, não implementações.asList(...)
retorna um tamanho fixoList
que explode em operações mutantes comoremove
eclear
, coisas que oList
contrato alega suporte. Mesmo que você tenha deixado a declaração comoList
, você precisará usarList l = new ArrayList(asList(...))
para obter um objeto que não gere exceções OperationNotSupported. Princípio da substituição de Liskov alguém?remove
eclear
são operações opcionaisList
, o mesmoasList(...)
acontece com o contrato. Em nenhum lugar o OP diz que ele precisa adicionar mais elementos posteriormente, o exemplo é apenas umList
que precisa ser inicializado com três elementos.A resposta simples
No Java 9 ou posterior, depois
List.of()
foi adicionado:Com o Java 10 ou posterior, isso pode ser reduzido com a
var
palavra - chave.Isso lhe dará um imutável
List
, por isso não pode ser alterado.Qual é o que você deseja na maioria dos casos em que está pré-preenchendo-o.
Java 8 ou anterior:
Isso lhe dará um
List
respaldo por uma matriz, portanto, não pode alterar o comprimento.Mas você pode ligar
List.set
, por isso ainda é mutável .Você pode
Arrays.asList
diminuir ainda mais com uma importação estática:A importação estática:
O que qualquer IDE moderno sugerirá e fará automaticamente por você.
Por exemplo, no IntelliJ IDEA, você pressiona
Alt+Enter
e selecionaStatic import method...
.No entanto, eu não recomendo encurtar o
List.of
método paraof
, porque isso se torna confuso.List.of
já é curto o suficiente e lê bem.Usando
Stream
sPor que tem que ser um
List
?Com o Java 8 ou posterior, você pode usar um
Stream
que seja mais flexível:Você pode concatenar
Stream
s:Ou você pode ir de a
Stream
paraList
:Mas de preferência, basta usar o
Stream
sem coletá-lo para aList
.Se você realmente precisa especificamente de um
java.util.ArrayList
(Você provavelmente não.)
Para citar JEP 269 (ênfase minha):
Se você quer tanto um pré-popular
ArrayList
e adicionar a ele posteriormente (por quê?), Usoou no Java 8 ou anterior:
ou usando
Stream
:Mas, novamente, é melhor usar o
Stream
diretamente em vez de coletá-lo para aList
.Programa para interfaces, não para implementações
Você disse que declarou a lista como
ArrayList
no seu código, mas você só deve fazer isso se estiver usando algum membro doArrayList
qual não estejaList
.O que você provavelmente não está fazendo.
Normalmente, você deve apenas declarar variáveis pela interface mais geral que você está indo para uso (por exemplo
Iterable
,Collection
ouList
), e inicialize-los com a aplicação específica (por exemploArrayList
,LinkedList
ouArrays.asList()
).Caso contrário, você está limitando seu código a esse tipo específico, e será mais difícil mudar quando você desejar.
Por exemplo, se você está passando um
ArrayList
para umvoid method(...)
:Outro exemplo seria sempre declarar a variável an
InputStream
mesmo que seja geralmente umaFileInputStream
ou aBufferedInputStream
, porque um dia em breve você ou outra pessoa desejará usar algum outro tipo deInputStream
.fonte
Arrays.asList
é um método estático. Veja docs.oracle.com/javase/1.5.0/docs/guide/language/…Se você precisar de uma lista simples de tamanho 1:
Se você precisar de uma lista de vários objetos:
fonte
Com o Goiaba, você pode escrever:
Na Goiaba também existem outros construtores estáticos úteis. Você pode ler sobre eles aqui .
fonte
java.util.Arrays
tais como,List<String> names = Arrays.asList("Beckah", "Sam", "Michael");
Literais de coleção não chegaram ao Java 8, mas é possível usar a API Stream para inicializar uma lista em uma linha bastante longa:
Se você precisa garantir que você
List
é umArrayList
:fonte
Com java-9e acima, conforme sugerido no JEP 269: Métodos de conveniência para coleções , isso pode ser alcançado usando literais de coleção agora com -
Uma abordagem semelhante se aplicaria a
Map
-que é semelhante à proposta Literais de coleções, conforme declarado por @coobird. Mais esclarecido também no JEP -
Alternativas
Relacionado: Qual é o objetivo dos Métodos de Fábrica de Conveniência sobrecarregados para Coleções em Java 9
fonte
fonte
Collections.unmodifiableList(Arrays.asList("Buenos Aires", "Córdoba", "La Plata"))
que aconteceunmodifiableList(asList("Buenos Aires", "Córdoba", "La Plata"))
com as importações estáticas. Você não precisa do Google Collections para isso.ImmutableList
para outros métodos que usam aList
, e então você perdeu essa documentação de qualquer maneira.Você pode criar um método de fábrica:
Mas não é muito melhor do que sua primeira refatoração.
Para maior flexibilidade, pode ser genérico:
fonte
No Java 9, podemos inicializar facilmente um
ArrayList
em uma única linha:ou
Essa nova abordagem do Java 9 tem muitas vantagens sobre as anteriores:
Consulte esta publicação para obter mais detalhes -> Qual é a diferença entre List.of e Arrays.asList?
fonte
A maneira mais compacta de fazer isso é:
fonte
Basta usar o código abaixo da seguinte maneira.
fonte
Com o Eclipse Collections, você pode escrever o seguinte:
Você também pode ser mais específico sobre os tipos e se eles são Mutáveis ou Imutáveis.
Você também pode fazer o mesmo com conjuntos e bolsas:
Nota: Sou um colaborador das Coleções Eclipse.
fonte
Aqui está outra maneira:
fonte
(Deve ser um comentário, mas muito longo, para uma nova resposta). Como outros já mencionaram, o
Arrays.asList
método é de tamanho fixo, mas esse não é o único problema. Também não lida muito bem com herança. Por exemplo, suponha que você tenha o seguinte:O resultado acima resulta em um erro do compilador, porque
List<B>
(que é retornado por Arrays.asList) não é uma subclasse deList<A>
, mesmo que você possa adicionar objetos do tipo B a umList<A>
objeto. Para contornar isso, você precisa fazer algo como:Esta é provavelmente a melhor maneira de fazer isso, esp. se você precisar de uma lista ilimitada ou usar herança.
fonte
Você pode usar as instruções abaixo:
Fragmento de código:
fonte
letters = Arrays.asList(new String[]{"A", "B", "C"});
Como Tom disse :
Mas desde que você se queixou de querer um ArrayList, primeiro você deve saber que ArrayList é uma subclasse de List e você pode simplesmente adicionar esta linha:
Embora isso possa fazer você reclamar de 'desempenho'.
Nesse caso, não faz sentido para mim, por que, como sua lista é predefinida, ela não foi definida como uma matriz (já que o tamanho é conhecido no momento da inicialização). E se essa é uma opção para você:
Caso você não se importe com as pequenas diferenças de desempenho, você também pode copiar uma matriz para um ArrayList de maneira muito simples:
Ok, mas no futuro você precisa um pouco mais do que apenas o nome do local, também precisa de um código de país. Supondo que ainda seja uma lista predefinida que nunca será alterada durante o tempo de execução, é adequado usar um
enum
conjunto, o que exigiria uma recompilação se a lista precisar ser alterada no futuro.se tornaria:
Os enum têm um
values
método estático que retorna uma matriz que contém todos os valores do enum na ordem em que são declarados, por exemplo:Nesse caso, acho que você não precisaria da sua ArrayList.
PS Randyaa demonstrou outra maneira interessante de usar o método utilitário estático Collections.addAll .
fonte
O Java 9 possui o seguinte método para criar uma lista imutável :
que é facilmente adaptado para criar uma lista mutável, se necessário:
Métodos semelhantes estão disponíveis para
Set
eMap
.fonte
fonte
Sim, com a ajuda de matrizes, você pode inicializar a lista de matrizes em uma linha,
fonte
Você pode usar
StickyList
do Cactoos :fonte
Tente com esta linha de código:
fonte
Em Java, você não pode fazer
Como foi apontado, você precisaria fazer uma inicialização entre chaves:
Mas isso pode forçá-lo a adicionar uma anotação
@SuppressWarnings("serial")
ou gerar um UUID serial que é irritante. Além disso, a maioria dos formatadores de código o desempacotará em várias instruções / linhas.Alternativamente, você pode fazer
mas então você pode querer fazer um
@SuppressWarnings("unchecked")
.Também de acordo com o javadoc, você deve ser capaz de fazer isso:
Mas não consigo compilar com o JDK 1.6.
fonte
Se você precisa ter uma lista de um item !
Collections é do pacote java.util .
fonte
A melhor maneira de fazer isso:
Basta criar uma função que possa ter quantos elementos quiser e chamá-la para adicioná-los em uma linha.
fonte
Object
.Aqui está o código de AbacusUtil
Declaração: Sou o desenvolvedor do AbacusUtil.
fonte
Para mim, o Arrays.asList () é o melhor e mais conveniente. Eu sempre gosto de inicializar dessa maneira. Se você é iniciante em Java Collections, gostaria que você referisse a inicialização ArrayList
fonte
add()
métodos?Por que não criar uma função utilitária simples que faça isso?
"
ll
" significa "lista literal".fonte
Curiosamente, nenhum one-liner com o outro método sobrecarregado
Stream::collect
está listadofonte
Na verdade, é possível fazer isso em uma linha:
fonte