Подтвердить что ты не робот

Присоединить список свойств объекта к строке

Я изучаю лямбду прямо сейчас, и мне интересно, как я могу написать этот код с помощью одной строки с лямбдой.

У меня есть класс Person, который включает поля ID и name

В настоящее время у меня есть List<Person>, который хранит эти объекты Person. То, что я хочу выполнить, - это получить строку, состоящую из идентификатора пользователя, как.

"ID1, ID2, id3" .

Как я могу выполнить это с помощью лямбда?

4b9b3361

Ответ 1

Чтобы получить String, состоящий из всего идентификатора, разделенного разделителем ",", сначала нужно map Person ID в новый поток, который затем можно применить Collectors.joining.

String result = personList.stream().map(Person::getId)
                          .collect(Collectors.joining(","));

если ваше поле ID не является String, а скорее int или некоторым другим примитивным числовым типом, вы должны использовать следующее решение:

String result = personList.stream().map(p -> String.valueOf(p.getId()))
                          .collect(Collectors.joining(","));

Ответ 2

для отображения и сбора в список!

List<String> myListofPersons = personList.stream()
          .map(Person::getId)
          .collect(Collectors.toList());

если вам нужно, что в объекте String присоедините список

String res = String.join(" , ", myListStringId);
System.out.println(res);

Ответ 3

Вы также можете использовать Отображение коллекционеров, как показано ниже:

String ids = personList.stream().collect(mapping(Person::getId
      , Collectors.joining(",")));

ИЛИ Person.ID не является экземпляром CharSequence, тогда вам нужно двойное сопоставление, как показано ниже:

String ids = personList.stream().collect(mapping(Person::getId
    , mapping(String::valueOf
        , Collectors.joining(","))));

Ответ 4

Немного перепроектирован, но полезно иметь, если эта проблема возникает чаще (особенно если вы добавляете перегруженные методы, которые делегируют это, используя по умолчанию мапперы и разделители):

/**
 * @param separator used to join the values. NOTE: the separator is interpreted as a regular expression.
 * @return a list of the values' string representation according to <code>mapper</code>, separated by the specified
 *         string. Null if list is null or empty.
 */
public static <R> String toListString(Collection<R> list, String separator,
                                      Function<? super R, ? extends String> mapper)
{
    if (list == null || list.isEmpty())
    {
        return null;
    }

    return list.stream()
               .map(mapper)
               .collect(Collectors.joining(separator));
}

и соответствующей обратной функции:

/**
 * @param list a list of values, separated by the specified separator
 * @param separator used to join the values. NOTE: the separator is interpreted as a regular expression.
 * @param mapper the function to map a single string to a value.
 * @return a list of the values. Empty if string is null or empty.
 */
public static <R> List<R> fromListString(String list, String separator,
                                         Function<? super String, ? extends R> mapper)
{
    if (list == null || list.isEmpty())
    {
        return new ArrayList<>();
    }

    return Arrays.stream(list.trim().split(separator))
                 .map(mapper)
                 .collect(Collectors.toCollection(ArrayList::new));
}

Если производительность является проблемой, я бы выбрал классический подход:

    StringBuilder s = new StringBuilder();
    for(R r : list){
        if (s.length() != 0)
            s.append(separator);
        s.append(mapper.apply(r));
    }
    return s.toString();

и

    List<R> result = new ArrayList<>();
    for (String s : list.trim().split(separator)){
        result.add(mapper.apply(s));
    }
    return result;