Existem muitas coisas novas úteis no Java 8. Por exemplo, eu posso iterar com um fluxo sobre uma lista de objetos e depois somar os valores de um campo específico das Object
instâncias da. Por exemplo
public class AClass {
private int value;
public int getValue() { return value; }
}
Integer sum = list.stream().mapToInt(AClass::getValue).sum();
Portanto, estou perguntando se existe alguma maneira de criar um String
que concatene a saída do toString()
método a partir das instâncias em uma única linha.
List<Integer> list = ...
String concatenated = list.stream().... //concatenate here with toString() method from java.lang.Integer class
Suponha que list
contém números inteiros 1
, 2
e 3
, eu espero que concatenated
seja "123"
ou "1,2,3"
.
java-8
java-stream
mat_boy
fonte
fonte
Respostas:
Uma maneira simples é anexar os itens da lista em um
StringBuilder
você também pode tentar:
Explicação: map converte fluxo Inteiro em fluxo String, depois é reduzido como concatenação de todos os elementos.
Nota: É o
normal reduction
que executa em O (n 2 )para um melhor desempenho, use um
StringBuilder
oumutable reduction
semelhante à resposta de F. Böller.Ref: Redução de Fluxo
fonte
join
do outro lado, pré-alocaria uma única matriz grande o suficiente para armazenar a sequência final antes de preenchê-la, tornando-a O (n).list.stream().map(Object::toString).reduce("", String::concat)
,. Usarmap e-> e.toString()
é um pouco redundante.Há um coletor
joining
na API. É um método estático noCollectors
.Não é perfeito por causa da chamada necessária de
toString
, mas funciona. Delimitadores diferentes são possíveis.fonte
import static java.util.stream.Collectors.joining;
Caso alguém esteja tentando fazer isso sem o java 8, existe um truque muito bom. List.toString () já retorna uma coleção parecida com esta:
[1,2,3]
Dependendo de seus requisitos específicos, isso pode ser pós-processado para o que você quiser, desde que os itens da lista não contenham [] ou,.
Por exemplo:
ou se seus dados podem conter colchetes, isso:
você obterá uma saída bastante razoável.
Um item de matriz em cada linha pode ser criado assim:
Eu usei essa técnica para criar dicas de ferramentas html a partir de uma lista em um aplicativo pequeno, com algo como:
Se você tiver uma matriz, inicie com Arrays.asList (list) .toString ()
Eu sou totalmente responsável pelo fato de que isso não é o ideal, mas não é tão ineficiente quanto você imagina e é bastante simples de ler e entender. É, no entanto, bastante inflexível - em particular, não tente separar os elementos com replaceAll se seus dados puderem conter vírgulas e usar a versão de substring se você tiver colchetes nos dados, mas para uma matriz de números é praticamente perfeito.
fonte
List
não impõe a estrutura detoString()
.AbstractCollection
no entanto, usa essa estrutura por padrão, e acho que todas asList
implementações de uso geral no Java SE também. Como exemplo de um queorg.springframework.util.AutoPopulatingList
não implementa , o Spring não implementatoString()
e, portanto, retornaria, por exemplo, "org.springframework.util.AutoPopulatingList@170a1
".Arrays.toString()
seria uma escolha melhor do queArrays.asList(list).toString()
, como é definido para retornar uma string equivalente, é mais conciso e não requer a criação de objetos adicionais.As outras respostas estão bem. No entanto, você também pode passar Collectors.toList () como parâmetro para Stream.collect () para retornar os elementos como um ArrayList.
fonte
System.out.print
(ln),(list)
ele usará otoString()
método dos elementos para imprimir a lista. Portanto, esse trecho de código está apenas repetindo o que acontece dentrotoString
da lista.StringListName = ObjectListName.stream (). Map (m -> m.toString ()) .collect (Collectors.toList ());
fonte
Existe um método na API String para os casos de "lista de junção de cadeias", você nem precisa do Stream.
fonte
Ou
Essa abordagem também permite criar um resultado de sequência a partir de uma lista de objetos
Aqui, a função reduzir permite que você tenha algum valor inicial ao qual deseja acrescentar uma nova string Exemplo:
fonte
Testando as duas abordagens sugeridas no Shail016 e a resposta bpedroso ( https://stackoverflow.com/a/24883180/2832140 ), o
StringBuilder
+ simplesappend(String)
dentro de umfor
loop, parece ser executado muito mais rapidamentelist.stream().map([...]
.Exemplo: Esse código percorre
Map<Long, List<Long>>
uma cadeia de caracteres json, usandolist.stream().map([...]
:Na minha VM de desenvolvimento, o junit normalmente leva entre 0,35 e 1,2 segundos para executar o teste. Enquanto, usando este código a seguir, leva entre 0,15 e 0,33 segundos:
fonte
Podemos tentar isso?
fonte
fonte
List
a um únicoString
e separa cada elemento com uma vírgula (,
).Vou usar a API de streams para converter um fluxo de números inteiros em uma única string. O problema com algumas das respostas fornecidas é que elas produzem um tempo de execução O (n ^ 2) devido à construção de String. Uma solução melhor é usar um StringBuilder e, em seguida, unir as seqüências como a etapa final.
Você pode levar esse processo um passo adiante convertendo a coleção de objetos em uma única sequência.
fonte
Com Java 8+
Não é o mais eficiente, mas é uma solução com uma pequena quantidade de código.
fonte
Além disso, você pode fazer assim.
fonte