使用 RxJava2 连接字符串
Concatenating strings with RxJava2
我有一个名为 Sport 的简单 POJO 列表,它有一个名称字段。
连接列表中所有名称的最佳方法是什么?
Observable.just(member.getSports())
.map(sports -> {
StringBuilder builder = new StringBuilder();
for (Sport sport : sports) {
builder.append(sport.getName());
}
return builder.toString()
})
我相信一定有更好的方法?
您应该始终努力编写易于阅读和维护的代码。
你不需要 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 扩展函数。
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()
生产:
volleyball, hockey, racquetball
我有一个名为 Sport 的简单 POJO 列表,它有一个名称字段。 连接列表中所有名称的最佳方法是什么?
Observable.just(member.getSports())
.map(sports -> {
StringBuilder builder = new StringBuilder();
for (Sport sport : sports) {
builder.append(sport.getName());
}
return builder.toString()
})
我相信一定有更好的方法?
您应该始终努力编写易于阅读和维护的代码。
你不需要 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 扩展函数。
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()
生产:
volleyball, hockey, racquetball