2017-05-05 5 views
1

私は、Java 7に準拠するために、次のJava 8のコードを書き換えたい:素朴な方法があるJava 7ストリームをJava 7パターンで書き換えるにはどうすればよいですか?

System.out.println("items: " + stringList.stream().collect(Collectors.joining(", "))); 

System.out.print("items: "); 
String joiner = ""; 
for (String item : stringList) { 
    System.out.print(joiner + item); 
    joiner = ", "; 
} 
System.out.println(); 

このタスクを達成するためにいくつかの代替のパターンは何ですか?たとえば、オブジェクトとしてカプセル化されたprint()を何らかの形で渡すコマンドパターンを使用できますか?

+0

のStringBuilder .... –

+1

それとも単にJDK 8 [StringJoiner]のソースコードを見てみましょう(HTTP ://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/8-b132/java/util/StringJoiner.java)クラスを作成し、そのJDK 7バージョンを作成してください –

+1

コードはほぼ正常です。私が行う唯一の変更は、不要な文字列の生成を避けるために、 'System.out.print''と' joiner'と 'item'を別々にすることです。 'StringBuilder'は単に文字をバッファリングするだけで、文字列を作成したり、文字の別のバッファに書き込んだりするので効率的ではありません。代わりに、その最終バッファに直接書き込んでください(すでに行っているように)。 –

答えて

0
StringBuilder sb = new StringBuilder("items: "); 
for (String item : stringList) { 
    sb.append(item).append(", "); 
} 
if (!stringList.isEmpty()) { 
    sb.setLength(sb.length() - 2); 
} 
System.out.println(sb.toString()); 

コメント:

  1. StringBuilderがコンストラクタの引数
  2. appendで初期化されるので、あなたがそれらをチェーンでき
  3. 最後の2つの文字は「後を避けるために削除する必要がStringBuilderを返します。 、 "
  4. stringListが空である可能性があります。そうでない場合は、末尾のカンマを削除してください。
  5. これは、一時的にたくさんの作成とコピーを避けるため、より効率的です。それは同じ流暢な参加の仕方が、JDK-7との互換性(明らかにあなたは、JDKであるグアバのバージョンを必要としているよりも、
+1

また、 '!sb.isEmpty()'があれば最初にコロンセパレータを追加し、次の項目を常に追加することができます。 –

+0

ありがとうございます。私は注意を引くことを意図した部分ではなかったので、元の投稿を編集してループ文字列の作成を削除しました。私の質問は、本当にどのように代替デザインパターンを使用して、特定のタスクを達成することです。たとえば、カプセル化された関数を変数として渡すコマンドパターンです。 –

2

あなたはクラスパス上グアバを持っている場合(をし、あなたは本当にすべきIMO)、 -7)互換性:

String joined = Joiner.on(",").join(stringList); 
0

ほぼ同じ、ちょうど連結回避:

System.out.print("items: "); 
boolean first = true; 
for (String item : stringList) { 
    if (! first) 
     System.out.print(", "); 
    System.out.print(item); 
    first = false; 
} 
System.out.println(); 

注:私たちは否定を使用する必要はありませんので、ブール値の意味を反転することができ、私は好むをそれは、読みやすくするためにy。あなたの元のJava 8のコード

System.out.println("items: " + stringList.stream().collect(Collectors.joining(", "))); 

は、Java 7では

System.out.println("items: " + String.join(", ", stringList)); 

に簡略化することができ、あなたが効率的に同じことを行うためにStringBuilderを使用する必要がありますが、あなたはカプセル化すること

0

注意それはJava 8のStringJoinerに似たユーティリティクラスにあります。同じAPIを持つクラスを使用すると、Java 7互換コードを作成することができます。このコードは、Java 8対応版を使用するためにまだ適応しやすいものです。

String s = stringList.toString(); 
System.out.append("items: ").append(s, 1, s.length()-1).println(); 

これ単に文字列の[]を印刷しない:

しかし、それはあなたが実際的なアプローチを使用することができ、これは、したがって、あなたのアプリケーションの最もパフォーマンスの重要な部分であることを、むしろそうですコンマで区切られたリストになります。この文字列表現は必須ではありませんが、この規約に準拠していない便利なコレクション実装の例を見つけるのは難しいでしょう。

「コマンドパターン」のようなものを参照して更新された質問については、質問のストリームコードで何もする必要はありませんが、上記のコードで使用されているような抽象概念が既にあります。

あなたは、例えば、ある程度の柔軟性を提供しています

static <A extends Appendable> A join(A target, CharSequence sep, List<?> data) { 
    try { 
     CharSequence currSep = ""; 
     for(Object item: data) { 
      target.append(currSep).append(item.toString()); 
      currSep = sep; 
     } 
     return target; 
    } catch(IOException ex) { 
     throw new IllegalStateException(ex); 
    } 
} 

のようなメソッドを作成することができますあなたが取得するためにそれを使用することができますString

String s = join(new StringBuilder(), ", ", stringList).toString(); 
System.out.println("items: " + s); 

か、単に印刷:

join(System.out.append("items: "), ", ", stringList).println(); 
関連する問題