From f3efb341fc21739bf7d431ddcd26b57985dc8d80 Mon Sep 17 00:00:00 2001 From: Darin Kelkhoff Date: Fri, 29 Mar 2024 08:26:40 -0500 Subject: [PATCH] Add ifCan utility method --- .../qqq/backend/core/utils/ObjectUtils.java | 24 +++++++++++++++++++ .../backend/core/utils/ObjectUtilsTest.java | 18 ++++++++++++++ 2 files changed, 42 insertions(+) diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/utils/ObjectUtils.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/utils/ObjectUtils.java index 80901c44..0fa1566e 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/utils/ObjectUtils.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/utils/ObjectUtils.java @@ -139,4 +139,28 @@ public class ObjectUtils return (b); } + + + /******************************************************************************* + ** Utility to test a chained unsafe expression CAN get to the end and return true. + ** + ** e.g., instead of: + ** if(a && a.b && a.b.c && a.b.c.d) + ** we can do: + ** if(ifCan(() -> a.b.c.d)) + ** + ** Note - if the supplier returns null, that counts as false! + *******************************************************************************/ + public static boolean ifCan(UnsafeSupplier supplier) + { + try + { + return supplier.get(); + } + catch(Throwable t) + { + return (false); + } + } + } diff --git a/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/utils/ObjectUtilsTest.java b/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/utils/ObjectUtilsTest.java index c08486b5..08a308e6 100644 --- a/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/utils/ObjectUtilsTest.java +++ b/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/utils/ObjectUtilsTest.java @@ -25,7 +25,9 @@ package com.kingsrook.qqq.backend.core.utils; import org.junit.jupiter.api.Test; import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertTrue; /******************************************************************************* @@ -79,4 +81,20 @@ class ObjectUtilsTest assertEquals("else", ObjectUtils.tryAndRequireNonNullElse(() -> null, "else")); } + + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + void testIfCan() + { + Object nullObject = null; + assertTrue(ObjectUtils.ifCan(() -> true)); + assertTrue(ObjectUtils.ifCan(() -> "a".equals("a"))); + assertFalse(ObjectUtils.ifCan(() -> 1 == 2)); + assertFalse(ObjectUtils.ifCan(() -> nullObject.equals("a"))); + assertFalse(ObjectUtils.ifCan(() -> null)); + } + } \ No newline at end of file