2015-03-04 4 views
2

Я использую потоки для конкатенации ряда строк и добавления запятых между ними, но в начале или в конце строки результата не должно быть запятой.Java Streams: Есть ли более чистый способ сделать это?

import java.util.Arrays; 
import java.util.List; 

public class QuestionNine { 
    public static void main(String[] args) { 
     new QuestionNine().launch(); 
    } 
    public void launch(){ 
     List<String> words = Arrays.asList("Hello", "Bonjour", "engine", "Hurray", "What", 
              "Dog", "boat", "Egg", "Queen", "Soq", "Eet"); 
     String result = (words.stream().map(str -> str + ",").reduce("", (a,b) -> a + b)); 
     result = result.substring(0, result.length() -1); //removes last comma 
     System.out.println(result); 
    } 
} 

Вместо использования метода String.substring() в конце, чтобы избавиться от последней запятой, есть способ, я мог бы удалил последнюю запятую внутри трубопровода потока?

+1

Просто используйте 'String # join'. Или собирайте поток с помощью 'Collectors.joining (", ")' –

ответ

0

Да, вы можете использовать Collectors.joining() здесь:

String joined = words.stream().collect(Collectors.joining(", ")); 

Или же, как отмечено в комментариях, вы можете использовать новый добавленный String.join(CharSequence, Iterable) метод.

String joined = String.join(", ", words); 
+0

С guava: 'Joiner.on (", ") .join (слова);' – atamanroman

3

Обычная идиома использовать соединяющую Collector с Streams.

String res = words.stream().collect(Collectors.joining(",")); 

Хотя вы можете использовать String.join в вашем случае, поскольку вы непосредственно имеет дело с Iterable.

String res = String.join(",", words); 

Проблема с подхода заключается в том, что функция отображения применить навязывают, что будет запятой в конце каждого слова. Вы можете избавиться от этого сопоставления; и примените функцию уменьшения, чтобы получить желаемый результат:

.stream().reduce("", (a,b) -> a.isEmpty() ? b : a+","+b); 

, но я не рекомендую это.

+0

Или: words.stream(). Reduce ((a, b) -> a + "," + b) .orElse (""); – uberwach

Смежные вопросы