2016-06-23 2 views
2

문자열이 있습니다. 각 문자열은 예를 들어이 같은 JSON 객체를 나타냅니다 자바 스트림 쉼표로 구분됨

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

는 내가 스트림을 사용하고 있는데 그 이유는 데이터베이스에서 많은 양의 데이터를 얻을. 그리고 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

절름발이 (그러나 공통) 접근 방식을 확장 할 수있다 모든 메시지 다음에 쉼표를 출력하지만 각 메시지 앞에 출력하려면 (첫 번째 메시지는 부울로 처리 할 수 ​​있음). – Thilo

+0

또 다른 절름발이 (그러나 일반적인) 접근법은 더미 항목을 추가하는 것입니다 (클라이언트 코드를 무시할 수 있다고 가정). – Thilo

+0

Thilo, 답장을 보내 주셔서 감사합니다. 첫 제안서가 마음에 듭니다. 스트림에서 각각을 사용할 때 요소가 처음인지 어떻게 확인할 수 있습니까? – user3127896

답변

2

람다 식은 깔끔한 기능이지만 익명의 내부 클래스는 존재하지 않는다는 점에 유의하십시오. 상태 보존 형 소비자가 필요한 경우 올바른 도구입니다. 당신은 여기에서 조건문을 필요로하지 않습니다 경우

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(']'); 

당신이 빈 스트림을 처리 할 수 ​​있고, 당신이없는 것

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(']');