anchor.diff:  try {
       data.stream()
           .map(lazy(URI::create))
  -        // this collector reads the whole stream and collects all valid URIs as well as all the
  +        // This collector reads the whole stream and collects all valid URIs as well as all the
           // exceptions that were thrown.
           .collect(throwingAtEnd(IllegalArgumentException.class));
   catch (CollectException e) {
  
positive.code: }
  ----
  
  This method can also be used on checked exceptions, if they are first wrapped into unchecked ones.
  [source,java]
  ----
  data.stream()
  
negative.code: 
  data.stream()
      // lazy() wraps URI::create into a function that returns suppliers, in order to delay the call
      // to URI::create.
      .map(lazy(URI::create))
      // The collector can therefore catch the exceptions and swallow them, effectively collecting
      // only valid URIs. The exception to swallow has to be specified in order to correctly propagate
      // other runtime exceptions.
      .collect(discarding(IllegalArgumentException.class));
  // => Stream(URI("http://zenika"), URI("http://devoxx"))
  
  data.stream()
      .map(lazy(URI::create))
      // This collector swallows the exception too, but it does not continue to read the stream once
      // the first one is thrown.
      .collect(upto(IllegalArgumentException.class));
  // => Stream(URI("http://zenika"))
  
  try {
      data.stream()
          .map(lazy(URI::create))
          // This collector propagates the first thrown exception, but valid URIs that have already
          // been processed are accessible.
          .collect(uptoAndThrow(IllegalArgumentException.class));
  catch (FailFastCollectException e) {
      // => e.getCause() returns the IllegalArgumentException
  