Hi Paul,

This looks good - I have noticed one copy/paste error in the javadoc
though:

OptionalInt.java:

looks like the throws clause of ifPresent and ifPresentOrElse have been
interverted:

138 * @throws NullPointerException if a value is present and {@code action} is 139 * null, or a value is not present and {@code emptyAction} is null.
 140      */
 141     public void ifPresent(IntConsumer action) {
 142         if (isPresent) {
 143             action.accept(value);
 144         }
 145     }
 146
 147     /**
 148      * If a value is present, perform the given action with the value,
 149      * otherwise perform the given empty-based action.
 150      *
 151      * @param action the action to be performed if a value is present
152 * @param emptyAction the empty-based action to be performed if a value is
 153      * not present
154 * @throws NullPointerException if value is present and {@code action} is
 155      * null
 156      * @since 1.9
 157      */
158 public void ifPresentOrElse(IntConsumer action, Runnable emptyAction) {


Concerning the test, should there be a test that verifies that NPE
is thrown when null is passed - as specified in the javadoc?

Best regards,

-- daniel

On 03/02/15 16:38, Paul Sandoz wrote:
Hi,

http://cr.openjdk.java.net/~psandoz/jdk9/JDK-8071670-Optional-ifPresentOrElse/webrev/

Here is another tweak to Optional (and primitives) that has some weight:

/**
  * If a value is present, perform the given action with the value,
  * otherwise perform the given empty-based action.
  *
  * @param action the action to be performed if a value is present
  * @param emptyAction the empty-based action to be performed if a value is
  * not present
  * @throws NullPointerException if a value is present and {@code action} is
  * null, or a value is not present and {@code emptyAction} is null.
  * @since 1.9
  */
public void ifPresentOrElse(Consumer<? super T> action, Runnable emptyAction) {
     if (value != null) {
         action.accept(value);
     } else {
         emptyAction.run();
     }
}

(In hindsight we should have been consistent and thrown NPEs regardless of the 
optional state. The exception throwing behaviour is consistent with ifPresent.)

Previously it was kind of awkward if one had two lambdas or method refs handy, 
one had to do:

   o.ifPresent(v -> ...);
   if (!o.ifPresent()) {
     ...
   }

Or just:

   if (o.ifPresent()) {
     ...
   } else {
      ...
   }


I also updated the language of the ifPresent methods to be more consistent with 
Collection/Stream.forEach.

Paul.


Reply via email to