Condições: não modifique as listas originais; Apenas JDK, sem bibliotecas externas. Pontos de bônus para uma versão one-liner ou JDK 1.3.
Existe uma maneira mais simples do que:
List<String> newList = new ArrayList<String>();
newList.addAll(listOne);
newList.addAll(listTwo);
Respostas:
No Java 8:
fonte
List<String> newList = Stream.concat(listOne.stream(), listTwo.stream()).distinct().collect(Collectors.toList());
Stream.of(listOne, listTwo).flatMap(Collection::stream).collect(Collectors.toList())
Em cima da minha cabeça, posso encurtá-lo em uma linha:
fonte
addAll()
de ambas. Tentei todos aqueles que sugerem não copiar as listas e eles resultam em muita sobrecarga que não precisávamos dessa vez.addAll(Collection)
retorna aboolean
.Você pode usar a biblioteca de coleções comuns do Apache :
fonte
Um dos seus requisitos é preservar as listas originais. Se você criar uma nova lista e usar
addAll()
, estará dobrando efetivamente o número de referências aos objetos em suas listas. Isso pode causar problemas de memória se suas listas forem muito grandes.Se você não precisar modificar o resultado concatenado, poderá evitar isso usando uma implementação de lista personalizada. A classe de implementação personalizada é mais de uma linha, obviamente ... mas usá-la é curta e agradável.
CompositeUnmodifiableList.java:
Uso:
fonte
Collections.unmodifiableList()
método, que envolve uma lista para torná-la inalterável.CompositeUnmodifiableList
faz a mesma coisa, exceto que envolve duas listas e fornece uma exibição concatenada. Todos os pontos que você mencionaCompositeUnmodifiableList
também são verdadeirosCollections.unmodifiableList()
.List<? extends E>
Provavelmente não é mais simples, mas intrigante e feio:
Não o use no código de produção ...;)
fonte
Outro linux de Java 8:
Como bônus, como
Stream.of()
é variável, você pode concatenar quantas listas quiser.fonte
x -> x.stream()
pode ser substituído porCollection::stream
.List::stream
.Não é mais simples, mas sem redimensionar a sobrecarga:
fonte
Encontrei essa pergunta procurando concatenar quantidades arbitrárias de listas, sem importar as bibliotecas externas. Então, talvez ajude alguém:
Útil se você deseja aplicar a mesma lógica a várias coleções diferentes em uma para ().
fonte
com.google.common.collect.Iterators#concat(java.util.Iterator<? extends java.util.Iterator<? extends T>>)
vez deIterables#concat()
; porque o posterior ainda copia elementos no link temporário!A solução proposta é para três listas, embora possa ser aplicada para duas listas também. No Java 8, podemos usar o Stream.of ou Stream.concat como:
Stream.concat
recebe dois fluxos como entrada e cria um fluxo concatenado preguiçosamente cujos elementos são todos os elementos do primeiro fluxo seguidos por todos os elementos do segundo fluxo. Como temos três listas, usamos esse método (Stream.concat
) duas vezes.Também podemos escrever uma classe de utilitário com um método que pega qualquer número de listas (usando varargs ) e retorna uma lista concatenada como:
Então podemos fazer uso desse método como:
fonte
Aqui está uma solução java 8 usando duas linhas:
Esteja ciente de que este método não deve ser usado se
newList
não é conhecida e já pode ser compartilhada com outros threadsnewList
é um fluxo paralelo e o acesso aonewList
não é sincronizado ou seguro por threaddevido a considerações sobre efeitos colaterais.
Ambas as condições acima não se aplicam ao caso acima de juntar duas listas, portanto, isso é seguro.
Com base nesta resposta a outra pergunta.
fonte
newList
não é observável por nenhum outro segmento. Mas você está correto que isso provavelmente não deve ser feito se não se sabe onde o valor donewList
veio (por exemplo, senewList
foi passado como um parâmetro..forEach(newList::addAll);
invés de.collect(Collectors.toList());
?List<List<Object>>
. O que você pode ter em mente é algo como isto: stackoverflow.com/questions/189559/…flatMap
.Isso é simples e tem apenas uma linha, mas adiciona o conteúdo de listTwo ao listOne. Você realmente precisa colocar o conteúdo em uma terceira lista?
fonte
Um pouco mais simples:
fonte
List
estrutura não impõe restrições de exclusividade. Você pode remover dupes fazendo o mesmo com conjuntos.Set<String> newSet = new HashSet<>(setOne); newSet.addAll(setTwo);
Um pouco mais curto seria:
fonte
Você pode criar seu método utilitário Java 8 genérico para concatinar qualquer número de listas .
fonte
Você pode executar um oneliner se a lista de destinos for pré-declarada.
fonte
No Java 8 (o contrário):
fonte
outra solução de liner usando
Java8
stream, como aflatMap
solução já foi lançada, aqui está uma solução semflatMap
ou
código
resultado
fonte
flatMap
, porque as listas são apenas reiterou uma vez quando são recolhidosO mais inteligente na minha opinião:
fonte
@SafeVarargs
!Você poderia fazer isso com uma importação estática e uma classe auxiliar
A geração desta classe provavelmente poderia ser melhorada.
Então você pode fazer coisas como
fonte
Versão Java 8 com suporte para união por chave de objeto:
fonte
fonte
Use uma classe Helper.
Eu sugiro:
fonte
fonte
Podemos juntar 2 listas usando java8 com 2 abordagens.
1) Usando concat:
2) Usando flatMap:
fonte
Quase todas as respostas sugerem o uso de um ArrayList.
Prefira usar um LinkedList para operações eficientes de adição.
A adição de ArrayList é O (1) amortizada, mas O (n) na pior das hipóteses, pois a matriz deve ser redimensionada e copiada. Enquanto o LinkedList add é sempre constante O (1).
mais informações https://stackoverflow.com/a/322742/311420
fonte
Eu não estou afirmando que é simples, mas você mencionou bônus para one-liners ;-)
fonte
De maneira nenhuma perto de uma linha, mas acho que é o mais simples:
fonte
Aqui está uma abordagem usando fluxos e java 8 se suas listas tiverem tipos diferentes e você desejar combiná-las com uma lista de outro tipo.
fonte
Se você quiser fazer isso estaticamente, faça o seguinte.
Os exemplos usam 2 EnumSets em ordem natural (== Enum-order)
A, B
e se juntam a umaALL
lista.fonte
fonte