我最近遇到了一个Java 8类StringJoiner
,它使用分隔符添加了String并为其添加了前缀和后缀,但是我不能理解这个类的需要,因为它也使用{{ 3}}在后端并且还执行非常简单的附加字符串的操作。
我是否因为没有真正理解这门课程的真正目的而错过了什么?
答案 0 :(得分:63)
StringJoiner
中加入字符串时, Stream
非常有用。
例如,如果你必须遵循字符串列表:
final List<String> strings = Arrays.asList("Foo", "Bar", "Baz");
使用
要简单得多final String collectJoin = strings.stream().collect(Collectors.joining(", "));
与StringBuilder
:
final String collectBuilder =
strings.stream().collect(Collector.of(StringBuilder::new,
(stringBuilder, str) -> stringBuilder.append(str).append(", "),
StringBuilder::append,
StringBuilder::toString));
答案 1 :(得分:19)
StringJoiner Javadoc上的示例非常擅长涵盖此问题。整个要点是从添加条目的行为中抽象出分离器的选择。例如你可以创建一个木匠,指定要使用的分隔符并将其传递给库来添加元素,反之亦然。
The String&#34; [George:Sally:Fred]&#34;可以如下构建:
StringJoiner sj = new StringJoiner(":", "[", "]"); sj.add("George").add("Sally").add("Fred"); String desiredString = sj.toString();
可以使用StringJoiner使用Collectors.joining(CharSequence)从Stream创建格式化输出。例如:
List<Integer> numbers = Arrays.asList(1, 2, 3, 4); String commaSeparatedNumbers = numbers.stream() .map(i -> i.toString()) .collect(Collectors.joining(", "));
答案 2 :(得分:13)
在某些用例中,它可能会简化您的代码:
List<String> list = // ...;
// with StringBuilder
StringBuilder builder = new StringBuilder();
builder.append("[");
if (!list.isEmpty()) {
builder.append(list.get(0));
for (int i = 1, n = list.size(); i < n; i++) {
builder.append(",").append(list.get(i));
}
}
builder.append("]");
// with StringJoiner
StringJoiner joiner = new StringJoiner(",", "[", "]");
for (String element : list) {
joiner.add(element);
}
答案 3 :(得分:10)
StringJoiner
是一种收集器,虽然它没有实现Collector
接口。它只是表现得这样。除了你可以传递分隔符,前缀和后缀之外,可以使用StringJoiner
来创建Stream
调用Collectors.joining(CharSequence)
的格式化输出。
这在使用并行流时尤其有用,因为在某些时候,并行处理的批次需要加入,这就是{ {1}}发生。
答案 4 :(得分:2)
StringJoiner比使用StringBuilder简单得多。一个非常简单的代码就像
StringJoiner sj = new StringJoiner(",");
sj.add("aaa");
sj.add("bbb");
sj.add("ccc");
String result = sj.toString(); //aaa,bbb,ccc