From 1f564eb74a5d9b7495d82bd98110d25a6664ea82 Mon Sep 17 00:00:00 2001 From: Googler Date: Mon, 27 Nov 2023 12:26:13 -0800 Subject: [PATCH] Implement Optional.ifPresentOrElse. PiperOrigin-RevId: 585727393 --- jre/java/java/util/Optional.java | 8 +++++ .../j2cl/jre/java8/util/OptionalTest.java | 32 +++++++++++++++++++ 2 files changed, 40 insertions(+) diff --git a/jre/java/java/util/Optional.java b/jre/java/java/util/Optional.java index aed531be1d..c4342a00de 100644 --- a/jre/java/java/util/Optional.java +++ b/jre/java/java/util/Optional.java @@ -72,6 +72,14 @@ public void ifPresent(Consumer consumer) { } } + public void ifPresentOrElse(Consumer consumer, Runnable emptyConsumer) { + if (isPresent()) { + consumer.accept(ref); + } else { + emptyConsumer.run(); + } + } + public Optional filter(Predicate predicate) { checkNotNull(predicate); if (!isPresent() || predicate.test(ref)) { diff --git a/jre/javatests/com/google/j2cl/jre/java8/util/OptionalTest.java b/jre/javatests/com/google/j2cl/jre/java8/util/OptionalTest.java index 55f49b2d33..65934c8896 100644 --- a/jre/javatests/com/google/j2cl/jre/java8/util/OptionalTest.java +++ b/jre/javatests/com/google/j2cl/jre/java8/util/OptionalTest.java @@ -107,6 +107,38 @@ public void testIfPresent() { assertTrue("Consumer not executed", mutableFlag[0]); } + public void testIfPresentOrElse() { + if (isWasm()) { + // TODO(b/183769034): Re-enable when NPE on dereference is supported + return; + } + + // empty case + empty.ifPresentOrElse(null, () -> {}); // should not fail as per JavaDoc + empty.ifPresentOrElse(wrapped -> fail("Empty Optional should not execute consumer"), () -> {}); + + // non-empty case + try { + present.ifPresentOrElse(null, () -> {}); + fail("Non-Empty Optional must throw NullPointerException if consumer is null"); + } catch (NullPointerException e) { + // expected + } + + present.ifPresentOrElse( + (wrapped) -> { + assertSame(REFERENCE, wrapped); + mutableFlag[0] = true; + }, + () -> fail("Non-Empty Optional should not call empty consumer")); + assertTrue("Consumer not executed", mutableFlag[0]); + mutableFlag[0] = false; + empty.ifPresentOrElse( + (wrapped) -> fail("Empty Optional should not call non-empty consumer"), + () -> mutableFlag[0] = true); + assertTrue("Consumer not executed", mutableFlag[0]); + } + public void testFilter() { if (isWasm()) { // TODO(b/183769034): Re-enable when NPE on dereference is supported