代码之家  ›  专栏  ›  技术社区  ›  Muhammad Ahmed AbuTalib

用rxjava2连接字符串

  •  2
  • Muhammad Ahmed AbuTalib  · 技术社区  · 8 年前

    我有一个名为sport的pojo的简单列表,其中有一个名称字段。 什么是最好的方法来浓缩列表中所有的名字?

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

    我相信一定有更好的办法?

    2 回复  |  直到 8 年前
        1
  •  1
  •   Sharp Steel Software    8 年前

    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()
    

    在Kotlin有一个班轮,带有RXKotlin

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

    生产:

    排球、曲棍球、壁球

        2
  •  2
  •   Willi Mentzel user670265    8 年前

    您应该始终努力寻找易于阅读和维护的代码。

    你不需要RXJava,只需要流:

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

    编辑1:

    因为流不是一个选项。无论如何,我都不会使用rxjava。只要用你的lambda里面的代码。

    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's joinToString 扩展函数。