import java.util.Optional;

/**
 * Test case for rule #3: "Prefer alternative APIs over Optional.isPresent() and Optional.get()."
 */
@SuppressWarnings("optional.parameter")
public class Marks3b {

  class Task {}

  class Executor {
    void runTask(Task t) {}
  }

  Executor executor = new Executor();

  void bad(Optional<Task> oTask) {
    // :: warning: (prefer.ifpresent)
    if (oTask.isPresent()) {
      executor.runTask(oTask.get());
    }
  }

  void better(Optional<Task> oTask) {
    // no warning; better code is possible but has nothing to do with Optional
    oTask.ifPresent(task -> executor.runTask(task));
  }

  void best(Optional<Task> oTask) {
    oTask.ifPresent(executor::runTask);
  }
}
