Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/371.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何有效地连接对象列表中的多个字符串变量?_Java_String_Foreach_Java 8_Concatenation - Fatal编程技术网

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