code: public static Observable<String> join(final Observable<String> source, final CharSequence separator) {
          return source.lift(new Operator<String, String>() {
              @Override
              public Subscriber<String> call(final Subscriber<? super String> child) {
                  final JoinParentSubscriber parent = new JoinParentSubscriber(child, separator);
                  child.add(parent);
                  child.setProducer(new Producer() {
                      @Override
                      public void request(long n) {
                         if (n > 0) {
                             parent.requestAll();
                         }
                      }});
                  return parent;
              }
          });
      }
docs: Concatenates the sequence of values by adding a separator
  between them and emitting the result once the source completes.
  <p>
  <img width="640" src="https://raw.github.com/wiki/ReactiveX/RxJava/images/rx-operators/St.join.png" alt="">
  <p>
  The conversion from the value type to String is performed via
  {@link java.lang.String#valueOf(java.lang.Object)} calls.
  <p>
  For example:
  
  <pre>
  Observable&lt;Object&gt; source = Observable.from(&quot;a&quot;, 1, &quot;c&quot;);
  Observable&lt;String&gt; result = join(source, &quot;, &quot;);
  </pre>
  
  will yield a single element equal to "a, 1, c".
  
  @param source
  the source sequence of CharSequence values
  @param separator
  the separator to a
  @return an Observable which emits a single String value having the concatenated
  values of the source observable with the separator between elements