2016-06-23 8 views
2

私はストリングのストリームを持っています。各文字列は次のようなjsonオブジェクトを表します。Javaストリームコンマ区切り

// {"foo": "bar", "bar": "foo"} 
String s1 = "{\"foo\": \"bar\", \"bar\": \"foo\"}"; 

私はStreamを使用しているため、データベースから大量のデータを取得します。 そして、私はこのデータをHTTPレスポンスの出力にストリームしたいと思います。

try (Stream<String> data = service.streamData()) { 
      os.write("[".getBytes()); 
      eventStream.forEach(s -> { 
         try { 
          os.write(s.getBytes()); 
          os.write(",".getBytes()); 
          os.write("\n".getBytes()); 
         } catch (IOException e) { 
          logger.error(e.getMessage()); 
         } 
        }); 
     } 
     os.write("{}]".getBytes()); 
     os.flush(); 

各文字列はjsonオブジェクトを表すため、これらのオブジェクトの配列を返したいとします。この場合は、手動で"[""]"を追加し、ストリーム内の各要素をコンマで区切ります。しかし、最終的には、最新の要素の後にカンマをつけます。そして、これは有効なjsonではありません。

それは次のようになりたい:

["{"foo": "bar", "bar": "foo"}", "{"foo": "bar1", "bar": "foo1"}",] 

ストリームを使用して、最新のカンマを取り除くためにどのように任意のアイデア?

+0

にそれを展開することがあります空のストリームを処理する必要がある場合には

stream.forEach(new Consumer<String>() { int header = '['; public void accept(String string) { try { os.write(header); os.write('\n'); os.write(string.getBytes(StandardCharsets.UTF_8)); header=','; } catch (IOException e) { logger.error(e.getMessage()); } } }); os.write('\n'); os.write(']'); 

、ラメ(しかし、一般的な)アプローチはしないようになりますすべてのメッセージの後にカンマを出力しますが、各メッセージの前に出力するようにしてください(最初のメッセージはブール値で処理できます)。 – Thilo

+0

もう1つの(一般的な)アプローチは、ダミーのエントリを追加するだけです(無視するようにクライアントコードを取得できると仮定します)。 – Thilo

+0

Thilo、あなたの答えをありがとう、私はちょっとあなたの最初の提案のように、私はストリームでそれぞれのために使用するとき、要素が最初であるかどうかを確認することができますか教えてくれますか? – user3127896

答えて

2

ラムダ式はきちんとした特徴ですが、匿名の内部クラスは存在しなくなりました。ステートフルなコンシューマーが必要な場合は、適切なツールです。あなたも、ここに条件文を必要としません:あなたは

os.write('['); 
stream.forEach(new Consumer<String>() { 
    int header = ' '; 
    public void accept(String string) { 
     try { 
      os.write(header); 
      os.write('\n'); 
      os.write(string.getBytes(StandardCharsets.UTF_8)); 
      header=','; 
     } catch (IOException e) { 
      //logger.error(e.getMessage()); 
     } 
    } 
}); 
os.write('\n'); 
os.write(']');