Конкатенация строк с помощью RxJava2 - PullRequest
0 голосов
/ 24 июня 2018

У меня есть простой список моего POJO под названием Sport, в котором есть поле имени. Каков наилучший способ объединить все имена в списке?

Observable.just(member.getSports())
          .map(sports -> {
              StringBuilder builder = new StringBuilder();
              for (Sport sport : sports) {
                  builder.append(sport.getName());
              }
              return builder.toString()
           })

Я считаю, что должен быть лучший способ?

Ответы [ 2 ]

0 голосов
/ 24 июня 2018

Willi Mentzel прав, что вам не нужен Rx, но если вы все равно хотите использовать его на простой Java для удобства чтения, вот отличный способ использовать Rx2

// Get a list of sports names
Observable<String> names = Observable.fromIterable(member.getSports()).map(sport -> sport.getName())

// Concat list into a single string output separated by comma
Single<String> listOfNames = names.collect(StringBuilder::new, (sb, x) -> sb.append(x).append(", ")).map(StringBuilder::toString).toSingle()

Однострочник в Java:

Observable.fromIterable(member.getSports()).map(sport -> sport.getName()).collect(StringBuilder::new, (sb, x) -> sb.append(x).append(", ")).map(StringBuilder::toString).toSingle()

Однострочник в Котлине с RxKotlin

member.getSports().map { it.name }.toObservable().collect(StringBuilder::new, (sb, x) -> sb.append(x).append(", ")).map(StringBuilder::toString).toSingle()

Производит:

волейбол, хоккей, ракетбол

0 голосов
/ 24 июня 2018

Вы всегда должны стремиться к коду, который легко читать и, следовательно, поддерживать.

Для этого вам не нужен RxJava, только потоки:

String joined = member.getSports().stream()
            .map(sport -> sport.getName())
            .collect(Collectors.joining(""));

Редактировать 1:

Так как потоки не вариант. Я бы тогда не использовал RxJava. Просто используйте код внутри вашей лямбды.

StringBuilder builder = new StringBuilder();
for (Sport sport : sports) {
   builder.append(sport.getName());
}
builder.toString()

Редактировать 2: Или вы создаете более обобщенную версию, если вам нужен также префикс и постфикс:

// Inside Utils.java
public static <T> String joinToString(List<T> list, String separator, String prefix, String postfix, Function<T, String> func) {
    StringBuilder builder = new StringBuilder();

    builder.append(prefix);

    if (!list.isEmpty()) {
        for (T t : list.subList(0, list.size() - 1)) {
            builder.append(func.apply(t));
            builder.append(separator);
        }

        builder.append(list.get(list.size() - 1));
    }

    builder.append(postfix);
    return builder.toString();
}

и используйте его так:

Utils.joinToString(member.getSports(), "", "", "", Sport::getName));

Это очень близко к расширенной функции Kotlin joinToString .

...