Есть ли простой способ конкатенации нескольких строк текста в строку без постоянного добавления новой строки?

Поэтому мне нужно сделать это:

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, который уже делает что-то вроде этого, а не мне нужно проводить класс между приложениями, чтобы я мог сделать что-то настолько тривиальное.

Спасибо!

Ответ 1

Вы можете использовать StringWriter, завернутый в PrintWriter:

StringWriter stringWriter = new StringWriter();
PrintWriter writer = new PrintWriter(stringWriter, true);
writer.println("line1");
writer.println("line2");
writer.println("line3");
useString(stringWriter.toString());

Ответ 2

AFAIK нет класса библиотеки, который позволяет это сделать.

Далее выполняется работа:

class DesiredStringThinger {
  StringBuilder text = new StringBuilder();

  public void append(String s) { text.append(s).append("\n"); }

  @Override
  public String toString() { return text.toString(); }
}

Ответ 3

public String createString () {
   StringBuilder sb = new StringBuilder ();
   String txt = appendLine("firstline", sb).appendLine("2ndLine", sb).toString();
}

private StringBuilder appendLine (String line, StringBuilder sb) {
   String lsp = System.getProperty("line.separator");
   return sb.append (line).append (lsp);
}

Ответ 4

Вы можете использовать Apache Commons помощник StringUtils.join. Это позволяет построить строку из списка. Вы можете добавить символ/строку разделителя.

Ответ 5

Если вы хотите использовать внешние библиотеки, ознакомьтесь с Joiner в Guava.

Ваш код будет выглядеть примерно так:

String result = Joiner.on("\n").join(parts);

где parts является Iterable<String>.

Ответ 6

Вы можете использовать StringBuffer

StringBuffer text = new StringBuffer();
text.append("line1");  
text.append("line2");  
...  
useString(text.toString());   

Это не добавит новый символ линии, но вы можете добавить это также для каждой строки.

Ответ 7

Возможно, самый низкий метод воздействия заключается в добавлении статического метода для добавления с новой строкой в ​​ StringBuilder.

 public static StringBuilder appendln(StringBuilder buff, String str) {
     return buff.append(str).append('\n');
 }

Но @Joachim Sauer бьет меня к моему предпочтительному решению. Для более сложных примеров вы можете использовать собственный декодер Writer, как @Rahul G (используйте только частные поля).

Ответ 8

Если вы не сумасшедшие в производительности, я думаю, что это чисто и аккуратно.

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

Ответ 9

Вот решение 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"));
    }

}