Add utility method to convert an Optional to a Stream

Change-Id: Ibc77d9bd7fc5232af01abc9b590a62801f13d65f
diff --git a/utils/misc/src/main/java/org/onlab/util/Tools.java b/utils/misc/src/main/java/org/onlab/util/Tools.java
index 61b1a8e..9bc6436 100644
--- a/utils/misc/src/main/java/org/onlab/util/Tools.java
+++ b/utils/misc/src/main/java/org/onlab/util/Tools.java
@@ -39,6 +39,7 @@
 import java.util.Collection;
 import java.util.Dictionary;
 import java.util.List;
+import java.util.Optional;
 import java.util.Random;
 import java.util.Set;
 import java.util.concurrent.CompletableFuture;
@@ -583,6 +584,17 @@
         return StreamSupport.stream(it.spliterator(), false);
     }
 
+    /**
+     * Converts an optional to a stream.
+     *
+     * @param optional optional to convert
+     * @param <T> type of enclosed value
+     * @return optional as a stream
+     */
+    public static <T> Stream<T> stream(Optional<T> optional) {
+        return optional.map(Stream::of).orElse(Stream.empty());
+    }
+
     // Auxiliary path visitor for recursive directory structure copying.
     private static class DirectoryCopier extends SimpleFileVisitor<Path> {
         private Path src;
diff --git a/utils/misc/src/test/java/org/onlab/util/ToolsTest.java b/utils/misc/src/test/java/org/onlab/util/ToolsTest.java
index 56f0f95..9466bde 100644
--- a/utils/misc/src/test/java/org/onlab/util/ToolsTest.java
+++ b/utils/misc/src/test/java/org/onlab/util/ToolsTest.java
@@ -18,8 +18,11 @@
 import org.junit.Test;
 import org.onlab.junit.TestTools;
 
+import java.util.Optional;
 import java.util.concurrent.ThreadFactory;
+import java.util.stream.Stream;
 
+import static org.hamcrest.Matchers.is;
 import static org.junit.Assert.*;
 import static org.onlab.junit.TestTools.assertAfter;
 
@@ -73,4 +76,14 @@
         assertAfter(100, () -> assertEquals("incorrect thread state", Thread.State.TERMINATED, t.getState()));
     }
 
+    @Test
+    public void testOptionalStream() {
+        Stream<Object> empty = Tools.stream(Optional.empty());
+        assertThat(empty.count(), is(0L));
+
+        String value = "value";
+        Stream<String> stream = Tools.stream(Optional.of(value));
+        assertThat(stream.allMatch(value::equals), is(true));
+    }
+
 }