Java 如何有效地连接对象列表中的多个字符串变量?
我想浏览对象列表,并为每个变量连接几个字符串:Java 如何有效地连接对象列表中的多个字符串变量?,java,string,foreach,java-8,concatenation,Java,String,Foreach,Java 8,Concatenation,我想浏览对象列表,并为每个变量连接几个字符串: final StringBuilder xBuilder = new StringBuilder(); final StringBuilder yBuilder = new StringBuilder(); final StringBuilder zBuilder = new StringBuilder(); someObjects.forEach(obj -> { A a = obj.getA(); xBuilder.append
final StringBuilder xBuilder = new StringBuilder();
final StringBuilder yBuilder = new StringBuilder();
final StringBuilder zBuilder = new StringBuilder();
someObjects.forEach(obj -> {
A a = obj.getA();
xBuilder.append(obj.getX() + ",");
yBuilder.append(obj.getY() + ",");
zBuilder.append(a.getZ() + ",");
});
有什么比为每个变量创建几个StringBuilder更有效的方法吗?好吧,您确实需要在这里创建3个单独的字符串,所以创建3个StringBuilder看起来很好。。您也可以使用StringJoiner
,不过:
StringJoiner xJoiner = new StringJoiner(",");
someObjects.forEach(obj -> {
xJoiner.join(obj.getX();
});
有没有比为每个变量创建几个StringBuilder更有效的方法
没有比为每个变量创建一个东西更有效的方法了
此处不要使用forEach
:与普通的旧循环相比没有任何优势(有关区别的问题,请参阅):
Collectors.joining()方法将在内部使用StringJoiner来附加带有传递分隔符的字符串,如这里的“,”
someObjects.stream().collect(Collectors.joining(","));
在连接对象的3个不同属性时,需要使用3个不同的
StringBuilder
实例(或StringJoiner
)。您可以迭代对象列表3次,每个属性一次,或者如果您只想迭代一次(尽管遍历列表非常便宜),您可以使用自己的方法或传统的foreach方法
或者您也可以使用我在下面展示的代码,它在语义上与其他答案相同,只是它允许将串联过程与迭代解耦(如果您需要的话):
我不知道它是否真的更有效,但另一种选择可能是一种新的方法。可能是你想要的。@AndyTurner上帝不,我不会只为你写一个收藏家that@AndyTurner您引用的是源自
流的forEach
文档,这不是使用that@AndyTurner或者,不实现自定义收集器,只需执行三个someObjects.stream().map(SomeObject::getwhere).collect(连接(“,”)
操作。我不知道为什么这么多人如此专注于避免迭代(在琐碎的集合上)。在这里,迭代的成本肯定不是最昂贵的。这甚至是不可预测的,哪种变体会更快…@Holger,因为,至少在这种情况下,这感觉是一件非常自然的事情do@Eugene它“感觉很自然”,因为朗站着专注。如果您习惯于编写专用语句,而不是一次完成多项任务,您可能会感觉不一样。举一个不同的例子,在学习到collection.toArray(新的ArrayType[collection.size()])
表达式之前,我已经写了20年了,这些众所周知的collection.toArray(新的ArrayType[0])
表达式实际上更快。因此,切换到更简单、更快的变体并不容易,因为另一个感觉“非常自然”。但在使用更好的变体一段时间后,我习惯了它。
someObjects.stream().collect(Collectors.joining(","));
StringBuilder xBuilder = new StringBuilder(); // no need to use final since
StringBuilder yBuilder = new StringBuilder(); // these instances are
StringBuilder zBuilder = new StringBuilder(); // effectively final
Consumer<SomeObject> action = ((Consumer<SomeObject>) obj ->
xBuilder.append(obj.getX() + ","))
.andThen(obj -> yBuilder.append(obj.getY() + ","))
.andThen(obj -> zBuilder.append(obj.getA().getZ() + ","));
someObjects.forEach(action);