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 exceptions that were
  -        // thrown.
  +        // 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) {
       // => e.getCauses() returns Collection(IllegalArgumentException)
  
positive.code: 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
  
negative.code: Collection<String> data = asList("http://zenika", "invalid\nurl", "http://devoxx");
  
  data.stream()
      // lazy() wraps URI::create into a function that returns suppliers, in order to delay the call
      // to URI::create. lazy() looks like
      .map(lazy(URI::create))
      // the collector can consequently 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"))
  
  