2017-02-11 16 views
2

Я хотел бы объединить каждые две строки в списке и возвращает список комбинации с использованием java8 потоков:Каждая комбинация из 2-х строк в списке Java 8

List<String> list; 
Stream.concat(list.stream(), list.stream()) 
        .collect(toList()); 

Однако этот код не производит комбинаций, но только элементы списков. Что я делаю не так. Мне также хотелось бы, чтобы этот код был распараллелен, чтобы он мог работать на нескольких ядрах.

+1

Ну, как бы вы ожидали, что совместить вещи по-разному? Прочитали ли вы документацию о том, что делает 'Stream.concat()'? Я не думаю, что это то, что вы хотите. –

+0

Вы просите «объединить все две строки в списке» - это, безусловно, звучит так же, как дубликат для меня. Посмотрите на разницу в ответах - все это отличается от 'str1 + str2' vs' Pair.of (x, y) '. –

ответ

4

Используйте flatMap, чтобы объединить строки в комбинаторном порядке. Каждая строка будет объединена с каждой строкой в ​​списке.

List<String> combinations = 
    list.stream() 
     .flatMap(str1 -> list.stream().map(str2 -> str1 + str2)) 
     .collect(toList()); 

Ideone Demo

Чтобы сделать операции параллельно, выгрузить .stream() для .parallelStream(). В зависимости от вашего размера ввода, это может сделать операцию медленнее или быстрее.

+0

Я попытался обновить документацию flatMap, но не мог этого понять. Есть ли где-нибудь, где я мог бы найти это объяснение в более простых выражениях? – Wideem

+1

Это как «карта», за исключением возвращаемого значения может быть 0 или более значений, а не только 1 значение. [Этот вопрос] (http://stackoverflow.com/q/26684562/5743988) может помочь. – 4castle

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

  • Нет связанных вопросов^_^