Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.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_Append_Concatenation - Fatal编程技术网

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,也可以使用。