Subato

String Spiterator

package name.panitz.util.streams;

import java.util.Spliterator;
import java.util.function.Consumer;
import java.util.stream.StreamSupport;

public class SpliterateString implements Spliterator<Character> {
  int i = 0;
  int end;
  String s;

  public SpliterateString(String s) {
    this(0, s.length() - 1, s);
  }

  public SpliterateString(int i, int end, String s) {
    this.i = i;
    this.end = end;
    this.s = s;
  }

  @Override
  public boolean tryAdvance(Consumer<? super Character> action) {
    if (i > end)
      return false;

    action.accept(s.charAt(i++));
    return true;
  }

  @Override
  public Spliterator<Character> trySplit() {
    int middle = i + (end - i) / 2;
    int oldEnd = end;
    end = middle;
    return new SpliterateString(middle + 1, oldEnd, s);
  }

  @Override
  public long estimateSize() {
    return end - i;
  }

  @Override
  public int characteristics() {
    return 0;
  }

  public static void main(String[] args) {
    StreamSupport.stream(new SpliterateString("hallo"), false).forEach(x -> System.out.println(x));

    System.out.println("und nun parallel");

    StreamSupport.stream(new SpliterateString("hallo"), true).forEach(x -> System.out.println(x));

  }
}