2016-12-04 2 views
-2

У меня есть функция, которая создает поток int, находит отдельные символы, сортирует их и затем собирает их в новый список, а затем создает строку. Ниже приведена функция.Java 8 Int Stream collect with StringBuilder

public static String longest(String s1, String s2) { 
    String s = s1 + s2; 
    return s.chars() 
      .distinct() 
      .sorted() 
      .collect(StringBuilder::new, StringBuilder::appendCodePoint, StringBuilder::append) 
      .toString(); 
} 

Я действительно изо всех сил пытается как собрать с StringBuilder работает, я искал в Интернете и Java документы, но не может сделать какой-либо смысл. Из того, что я могу понять, он создает новый экземпляр StringBuilder и просто добавляет каждый символ в поток, может ли кто-нибудь дать лучшее объяснение? Спасибо

+1

Прочтите учебник: https://docs.oracle.com/javase/tutorial/collections/streams/reduction.html#collect –

+1

Важно знать, что именно вас беспокоит. Используется ли 'collect' с 3 параметрами? Это метод-ссылки 'StringBuilder :: new' и другие? – Tunaki

+0

Да, это 3 набора параметров, которые меня путают – pocockn

ответ

5

Аргумент 1: Создает ваш исходный результат (в данном случае ваш новый StringBuilder).

Аргумент 2: Добавляет элемент (String) к вашему результату (StringBuilder).

Аргумент 3: Если вы запускаете поток параллельно, будет создано несколько StringBuilders. Это для их объединения.

6

Чтобы понять три аргумента, вам нужно понять, что нужно сделать потоку: он перемещается по символам и должен добавлять их в StringBuilder.

Итак, первое, что нужно знать, - это создать пустой StringBuilder. Вот для чего первый аргумент: он предоставляет функцию, которая при вызове потока создает пустой StringBuilder.

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

Это все, что вам нужно, если поток последователен. Но если поток параллелен, поток разбивает элементы на несколько частей и обрабатывает каждую часть параллельно. Предположим, он просто использует две части. Он дважды вызывает первую функцию для создания двух пустых StringBuilders и обрабатывает каждую часть параллельно, используя вторую функцию для добавления символов к двум StringBuilders.

В конце каждая часть преобразуется в StringBuilder, содержащую половину символов. Таким образом, поток должен знать, как объединить эти два StringBuilders вместе. Вот для чего третий аргумент. Это функция, которая при вызове Stream объединяет два StringBuilder вместе, добавляя все символы от второго к первому.

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