Eu tenho uma lista de inteiros List<Integer>
e gostaria de converter todos os objetos inteiros em Strings, terminando assim com um novo List<String>
.
Naturalmente, eu poderia criar um novo List<String>
e percorrer a lista chamando String.valueOf()
cada número inteiro, mas gostaria de saber se há uma maneira melhor (leia-se: mais automática ) de fazer isso?
java
string
collections
integer
ChrisThomas123
fonte
fonte
Usando as coleções do Google do Guava-Project , você pode usar o
transform
método na classe ListsO
List
retornado portransform
é uma visualização na lista de apoio - a transformação será aplicada em cada acesso à lista transformada.Esteja ciente de que
Functions.toStringFunction()
lançará umNullPointerException
quando aplicado a null, portanto, use-o somente se tiver certeza de que sua lista não conterá null.fonte
Solução para Java 8. Um pouco mais longa que a Guava, mas pelo menos não precisa instalar biblioteca.
fonte
toString
exemplo, ele acaba sendo mais curto para conversões não suportadas pela biblioteca de funções do Guava. Funções personalizadas ainda são fáceis, mas é significativamente mais código do que este fluxo Java 8O que você está fazendo está bem, mas se sentir a necessidade de fazer um 'Java-it-up', você pode usar um Transformer e o método de coleta do Apache Commons , por exemplo:
..e depois..
fonte
A fonte de String.valueOf mostra isso:
Não que isso importe muito, mas eu usaria toString.
fonte
Em vez de usar String.valueOf, eu usaria .toString (); evita alguns dos boxe automático descritos por @ johnathan.holland
O javadoc diz que valueOf retorna a mesma coisa que Integer.toString ().
fonte
Aqui está uma solução de uma linha sem trapacear com uma biblioteca não JDK.
fonte
Outra solução usando Guava e Java 8
fonte
Não é o núcleo do Java e não é genérico, mas a popular biblioteca de coleções comuns de Jakarta tem algumas abstrações úteis para esse tipo de tarefa. Especificamente, dê uma olhada nos métodos de coleta em
CollectionUtils
Algo a considerar se você já estiver usando coleções comuns em seu projeto.
fonte
Para as pessoas preocupadas com o "boxe" na resposta de jsight: não há nenhum.
String.valueOf(Object)
é usado aqui, e nenhum unboxing paraint
é executado.Se você usa
Integer.toString()
ouString.valueOf(Object)
depende de como deseja tratar possíveis nulos. Você deseja lançar uma exceção (provavelmente) ou ter Strings "nulas" em sua lista (talvez). Se for o primeiro, você quer jogar umNullPointerException
ou algum outro tipo?Além disso, uma pequena falha na resposta do jsight:
List
é uma interface, você não pode usar o novo operador nela. Eu provavelmente usaria umjava.util.ArrayList
neste caso, especialmente porque sabemos de antemão o tamanho provável da lista.fonte
fonte
@Jonathan: Posso estar enganado, mas acredito que String.valueOf () neste caso chamará a função String.valueOf (Object) em vez de ser encaixotado em String.valueOf (int). String.valueOf (Object) apenas retorna "nulo" se for nulo ou chama Object.toString () se não nulo, o que não deve envolver boxing (embora, obviamente, instanciar novos objetos de string esteja envolvido).
fonte
Acho que usar Object.toString () para qualquer propósito diferente de depuração é provavelmente uma ideia muito ruim, embora, nesse caso, os dois sejam funcionalmente equivalentes (assumindo que a lista não tenha nulos). Os desenvolvedores são livres para alterar o comportamento de qualquer método toString () sem qualquer aviso, incluindo os métodos toString () de qualquer classe na biblioteca padrão.
Nem se preocupe com os problemas de desempenho causados pelo processo de boxing / unboxing. Se o desempenho for crítico, basta usar um array. Se for realmente crítico, não use Java. Tentar ser mais esperto que o JVM só levará à dor de cabeça.
fonte
Uma resposta apenas para especialistas:
fonte
String
) compartilhará a mesma matriz de apoio (deall
), então será realmente bastante eficiente em termos de memória, o que seria importante para o desempenho de longo prazo. A menos que você queira manter apenas um dos elementos do curso ...Lambdaj permite fazer isso de uma forma muito simples e legível. Por exemplo, supondo que você tenha uma lista de Inteiros e deseja convertê-los na representação String correspondente, você poderia escrever algo assim;
Lambdaj aplica a função de conversão apenas enquanto você está iterando no resultado.
fonte
Você não pode evitar a "sobrecarga do boxe"; Os falsos contêineres genéricos do Java só podem armazenar objetos, então seus ints devem ser encaixotados em inteiros. Em princípio, isso poderia evitar o downcast de Object para Integer (uma vez que é inútil, porque Object é bom o suficiente para String.valueOf e Object.toString), mas não sei se o compilador é inteligente o suficiente para fazer isso. A conversão de String para Object deve ser mais ou menos autônoma, então eu não gostaria de me preocupar com isso.
fonte
Podemos usar o iterador para conseguir o mesmo.
fonte
Usando Streams: Se digamos que o resultado é uma lista de inteiros (
List<Integer> result
), então:Uma das maneiras de resolver isso. Espero que isto ajude.
fonte
Uma solução um pouco mais concisa usando o método forEach na lista original:
fonte
Apenas por diversão, uma solução usando a estrutura de junção de garfo jsr166y que deveria estar no JDK7.
(Isenção de responsabilidade: não compilado. A especificação não foi finalizada. Etc.)
O improvável de estar no JDK7 é um pouco de inferência de tipo e açúcar sintático para tornar a chamada withMapping menos detalhada:
fonte
Isso é algo tão básico que eu não usaria uma biblioteca externa (isso causará uma dependência em seu projeto que você provavelmente não precisa).
Temos uma classe de métodos estáticos criados especificamente para esse tipo de trabalho. Como o código para isso é tão simples, deixamos o Hotspot fazer a otimização para nós. Este parece ser um tema em meu código recentemente: escrever código muito simples (direto) e deixar o Hotspot fazer sua mágica. Raramente temos problemas de desempenho em torno de código como este - quando uma nova versão VM chega, você obtém todos os benefícios extras de velocidade, etc.
Por mais que eu ame as coleções Jakarta, elas não suportam Genéricos e usam 1.4 como LCD. Desconfio das Coleções do Google porque elas estão listadas como nível de suporte Alfa!
fonte
Eu só queria sugerir uma solução orientada a objetos para o problema.
Se você modelar objetos de domínio, a solução está nos objetos de domínio. O domínio aqui é uma lista de inteiros para os quais queremos valores de string.
A maneira mais fácil seria não converter a lista.
Dito isso, para converter sem converter, altere a lista original de Inteiro para Lista de Valor, onde Valor se parece com isto ...
Isso será mais rápido e ocupará menos memória do que copiar a lista.
Boa sorte!
fonte