You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by ba...@apache.org on 2009/11/05 08:25:54 UTC

svn commit: r833016 - in /commons/proper/lang/trunk/src: java/org/apache/commons/lang/ObjectUtils.java test/org/apache/commons/lang/ObjectUtilsTest.java

Author: bayard
Date: Thu Nov  5 07:25:54 2009
New Revision: 833016

URL: http://svn.apache.org/viewvc?rev=833016&view=rev
Log:
Applying Jörg Gottschling's patch from LANG-358 with Thomas Menzel's naming from LANG-550 and some of his tests. This adds a firstNonNull method to ObjectUtils. 

Modified:
    commons/proper/lang/trunk/src/java/org/apache/commons/lang/ObjectUtils.java
    commons/proper/lang/trunk/src/test/org/apache/commons/lang/ObjectUtilsTest.java

Modified: commons/proper/lang/trunk/src/java/org/apache/commons/lang/ObjectUtils.java
URL: http://svn.apache.org/viewvc/commons/proper/lang/trunk/src/java/org/apache/commons/lang/ObjectUtils.java?rev=833016&r1=833015&r2=833016&view=diff
==============================================================================
--- commons/proper/lang/trunk/src/java/org/apache/commons/lang/ObjectUtils.java (original)
+++ commons/proper/lang/trunk/src/java/org/apache/commons/lang/ObjectUtils.java Thu Nov  5 07:25:54 2009
@@ -318,4 +318,36 @@
         }
     }
 
+    /**
+     * <p>Returns the first passed value which is not <code>null</code> or
+     * <code>null</code> otherwise.</p>
+     * 
+     * <pre>
+     * ObjectUtils.firstNonNull(null, null)      = null
+     * ObjectUtils.firstNonNull(null, "")        = ""
+     * ObjectUtils.firstNonNull(null, null, "")  = ""
+     * ObjectUtils.firstNonNull(null, "zz")      = "zz"
+     * ObjectUtils.firstNonNull("abc", *)        = "abc"
+     * ObjectUtils.firstNonNull(null, "xyz", *)  = "xyz"
+     * ObjectUtils.firstNonNull(Boolean.TRUE, *) = Boolean.TRUE
+     * ObjectUtils.firstNonNull()                = null
+     * </pre>
+     *
+     * @param values  the values to test, may be <code>null</code> or empty
+     * 
+     * @return The first value from <code>values</code> which is not
+     *         <code>null</code> or <code>null</code> otherwise.
+     */
+    public static <T> T firstNonNull(T... values) {
+      // This is a trivial implementation. There may be faster ones.
+      // According to the JRE Libraries, overloading the method with fixed
+      // parameter sizes may be faster.
+      for (T val : values) {
+        if (val != null && val != ObjectUtils.NULL) {
+          return val;
+        }
+      }
+      return null;
+    }
+
 }

Modified: commons/proper/lang/trunk/src/test/org/apache/commons/lang/ObjectUtilsTest.java
URL: http://svn.apache.org/viewvc/commons/proper/lang/trunk/src/test/org/apache/commons/lang/ObjectUtilsTest.java?rev=833016&r1=833015&r2=833016&view=diff
==============================================================================
--- commons/proper/lang/trunk/src/test/org/apache/commons/lang/ObjectUtilsTest.java (original)
+++ commons/proper/lang/trunk/src/test/org/apache/commons/lang/ObjectUtilsTest.java Thu Nov  5 07:25:54 2009
@@ -216,4 +216,19 @@
 
         assertNull( ObjectUtils.min((String)null, (String)null) );
     }
+
+    public void testFirstNonNull() {
+      assertEquals(null, ObjectUtils.firstNonNull(null, null));
+      assertEquals("", ObjectUtils.firstNonNull(null, ""));
+      assertEquals("123", ObjectUtils.firstNonNull(null, null, "123", "456"));
+      assertEquals("123", ObjectUtils.firstNonNull("123", null, "456", null));
+      assertEquals(null, ObjectUtils.firstNonNull());
+      assertSame(Boolean.TRUE, ObjectUtils.firstNonNull(Boolean.TRUE));
+      assertNull(ObjectUtils.firstNonNull());
+      assertNull(ObjectUtils.firstNonNull(null, null));
+      assertSame("123", ObjectUtils.firstNonNull(null, ObjectUtils.NULL, "123", "456"));
+      assertSame("456", ObjectUtils.firstNonNull(ObjectUtils.NULL, "456", "123", null));
+      assertNull(ObjectUtils.firstNonNull(null, null, ObjectUtils.NULL));
+    }
+
 }