我有一个名为Sport的POJO的简单列表,其中有一个name字段。 连接列表中所有名称的最佳方法是什么?
Observable.just(member.getSports())
.map(sports -> {
StringBuilder builder = new StringBuilder();
for (Sport sport : sports) {
builder.append(sport.getName());
}
return builder.toString()
})
我相信必须有更好的方法吗?
答案 0 :(得分:2)
您应该始终争取易于阅读并易于维护的代码。
您不需要RxJava,只需流式传输即可:
String path = file.toURI().toString();
编辑1:
因为不能选择流。无论如何,我不会再使用RxJava。只需从lambda内部使用代码即可。
String joined = member.getSports().stream()
.map(sport -> sport.getName())
.collect(Collectors.joining(""));
修改2: 或者,如果需要前缀和后缀,则构建一个更通用的版本:
StringBuilder builder = new StringBuilder();
for (Sport sport : sports) {
builder.append(sport.getName());
}
builder.toString()
并像这样使用它:
// 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();
}
这非常接近Kotlin's joinToString扩展功能。
答案 1 :(得分:1)
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在Kotlin中进行单线操作
member.getSports().map { it.name }.toObservable().collect(StringBuilder::new, (sb, x) -> sb.append(x).append(", ")).map(StringBuilder::toString).toSingle()
产生:
排球,曲棍球,壁球