Java 有没有一种简单的方法可以将几行文本连接成一个字符串,而无需不断追加换行符?
所以我基本上需要这样做:Java 有没有一种简单的方法可以将几行文本连接成一个字符串,而无需不断追加换行符?,java,string,append,concatenation,Java,String,Append,Concatenation,所以我基本上需要这样做: String text = "line1\n"; text += "line2\n"; text += "line3\n"; useString( text ); 有更多的参与,但这是基本的想法。有没有什么东西可以让我在这方面做得更好 DesiredStringThinger text = new DesiredStringThinger(); text.append( "line1" ); text.append( "line2" ); text.append( "
String text = "line1\n";
text += "line2\n";
text += "line3\n";
useString( text );
有更多的参与,但这是基本的想法。有没有什么东西可以让我在这方面做得更好
DesiredStringThinger text = new DesiredStringThinger();
text.append( "line1" );
text.append( "line2" );
text.append( "line3" );
useString( text.toString() );
显然,它不需要像那样工作,但我想我已经理解了基本要点。总是可以选择编写一个自己处理文本的循环,但是如果有一个标准的Java类已经在做类似的事情,而不是我需要在应用程序之间携带一个类,这样我就可以做一些非常琐碎的事情,那就太好了
谢谢 AFAIK没有允许您这样做的库类 不过,以下工作可以完成:
class DesiredStringThinger {
StringBuilder text = new StringBuilder();
public void append(String s) { text.append(s).append("\n"); }
@Override
public String toString() { return text.toString(); }
}
您可以使用StringBuffer
StringBuffer text = new StringBuffer();
text.append("line1");
text.append("line2");
...
useString(text.toString());
这不会附加新行字符,但您当然也可以为每行附加该字符。您可以使用包装在:
可能影响最小的方法是添加一个静态方法,在
StringBuilder
中添加新行
public static StringBuilder appendln(StringBuilder buff, String str) {
return buff.append(str).append('\n');
}
但是,
@Joachim Sauer
让我想到了我喜欢的解决方案。对于更复杂的示例,您可能希望使用自己的编写器
装饰器,如@Rahul G
(仅使用私有字段)。如果您不热衷于性能,我认为这是干净整洁的
class DesiredStringThinger {
StringBuilder sb = new StringBuilder();
public void concat(String... s) {
for(String str : s){
sb.append(s).append("\n");
}
}
@Override
public String toString() {
return sb.toString();
}
}
可以从StringUtils.join帮助器使用。它允许从列表中构建字符串。您可以添加“分隔符”字符/字符串。如果您愿意使用外部库,请查看Guava中的 你的代码会变成
String result = Joiner.on("\n").join(parts);
其中,
parts
是一个Iterable
下面是一个使用流的Java 8解决方案:
public class DesiredStringThinger {
private List<String> items = new ArrayList<>();
public void append(String s) {
items.add(s);
}
@Override
public String toString() {
return items.stream().collect(Collectors.joining("\n", "", "\n"));
}
}
公共类需要StringThinger{
私有列表项=新的ArrayList();
公共void追加(字符串s){
项目。添加(s);
}
@凌驾
公共字符串toString(){
return items.stream().collect(collector.joining(“\n”,”,“\n”);
}
}
在java 8中,您可以这样做
String[]line=新字符串[]{“line1”、“line2”、“line3”};
字符串s=String.join(“\n”,行);
文档JavaSE8
使用Java SE 8,还可以通过以下几种方式:
import java.util.Arrays;
import java.util.stream.Collectors;
public class Main {
public static void main(String[] args) {
String[] arr = { "line1", "line2", "line3" };
// Using String#join
System.out.println(String.join(System.lineSeparator(), arr));
System.out.println();
// Using Stream
System.out.println(Arrays.stream(arr).collect(Collectors.joining(System.lineSeparator())));
}
}
line1
line2
line3
line1
line2
line3
输出:
import java.util.Arrays;
import java.util.stream.Collectors;
public class Main {
public static void main(String[] args) {
String[] arr = { "line1", "line2", "line3" };
// Using String#join
System.out.println(String.join(System.lineSeparator(), arr));
System.out.println();
// Using Stream
System.out.println(Arrays.stream(arr).collect(Collectors.joining(System.lineSeparator())));
}
}
line1
line2
line3
line1
line2
line3
我想当append()被调用时,Marshmellow1328希望在每个标记之间有一个新行。这实际上是我开始的地方。然后我厌倦了为每一行添加换行符。虽然我可以很容易地创建一个小的帮助函数来完成它,但我希望可能已经存在一些东西,而不是必须扩展我的基本java库。StringBuffer是同步的,但我认为“性能问题”?不。无争用锁获取速度快。事实上,在以后的JVM中,不必要的锁被优化掉了。但我想你也没有理由喜欢StringBuffer…这个解决方案很优雅。我喜欢使用委托创建包装器。@Tomislav:我不明白为什么在这个解决方案中性能会特别差。我确信Rahul最初的连接代码是沿着
text+=line代码>,但看看答案历史,似乎我错了。我道歉,拉胡尔。@Tomislav:你是对的。首先,我发布了一条又快又脏的text+=行代码>解决方案,并在2-3分钟内将其更改为StringBuffer
备选方案(在我看到您的评论之前)。也许这就是为什么原始帖子没有出现在编辑历史中。然后根据Zwei的建议,我将其更改为StringBuilder
。我为我造成的混乱道歉(这可能是基于stl和输出示例的最干净的解决方案。如果使用动态ArrayList而不是StringArray,也可以使用。