This is an automated email from the ASF dual-hosted git repository.

andy pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/jena.git

commit 7b4d6c631be46186947061495edf970555dc7df7
Author: Andy Seaborne <[email protected]>
AuthorDate: Wed Feb 4 18:10:32 2026 +0000

    Add Iter.mapRemove
---
 .../java/org/apache/jena/atlas/iterator/Iter.java  | 27 ++++++++++++
 .../org/apache/jena/atlas/iterator/TestIter.java   | 48 +++++++++++++++++++++-
 2 files changed, 73 insertions(+), 2 deletions(-)

diff --git a/jena-base/src/main/java/org/apache/jena/atlas/iterator/Iter.java 
b/jena-base/src/main/java/org/apache/jena/atlas/iterator/Iter.java
index ac8cc3fc43..b32ee61c03 100644
--- a/jena-base/src/main/java/org/apache/jena/atlas/iterator/Iter.java
+++ b/jena-base/src/main/java/org/apache/jena/atlas/iterator/Iter.java
@@ -420,6 +420,15 @@ public class Iter<T> implements IteratorCloseable<T> {
         return new IterMap<>(stream, converter);
     }
 
+    /**
+     * Apply a function to every element of an iterator, transforming it
+     * from a {@code T} to an {@code R}. If the mapped object is null, skip
+     * this mapping. Equivalent to {@code removeNulls(map(stream, mapper)) }
+     */
+    public static <T, R> Iterator<R> mapRemove(Iterator<T> stream, Function<T, 
R> mapper) {
+        return Iter.iter(stream).map(mapper).removeNulls();
+    }
+
     private static final class IterMap<T,R> implements IteratorCloseable<R> {
         private final Iterator<? extends T> stream;
         private final Function<T, R> converter;
@@ -931,6 +940,13 @@ public class Iter<T> implements IteratorCloseable<T> {
         this.iterator = iterator;
     }
 
+    /**
+     * Unwrap the iterator.
+     */
+    public Iterator<T> get() {
+        return iterator;
+    }
+
     @Override
     public void close() {
         Iter.close(iterator);
@@ -1021,6 +1037,17 @@ public class Iter<T> implements IteratorCloseable<T> {
     public <R> Iter<R> flatMap(Function<T, Iterator<R>> converter) {
         return iter(flatMap(iterator, converter));
     }
+
+    // Convenience form.
+    /**
+     * Map each element using given function.
+     * If the function returns null, filter out this element.
+     * Equivalent to {@code .map(mapper).removeNulls()}
+     */
+    public <R> Iter<R> mapRemoveNulls(Function<T, R> converter) {
+        return this.map(converter).removeNulls();
+    }
+
     /**
      * Apply an action to everything in the stream, yielding a stream of the
      * original items.
diff --git 
a/jena-base/src/test/java/org/apache/jena/atlas/iterator/TestIter.java 
b/jena-base/src/test/java/org/apache/jena/atlas/iterator/TestIter.java
index a63fd2d2d0..7d0d2a1538 100644
--- a/jena-base/src/test/java/org/apache/jena/atlas/iterator/TestIter.java
+++ b/jena-base/src/test/java/org/apache/jena/atlas/iterator/TestIter.java
@@ -21,6 +21,7 @@
 
 package org.apache.jena.atlas.iterator;
 
+import static java.util.stream.Collectors.toList;
 import static org.junit.jupiter.api.Assertions.assertEquals ;
 import static org.junit.jupiter.api.Assertions.assertFalse ;
 import static org.junit.jupiter.api.Assertions.assertTrue ;
@@ -218,16 +219,59 @@ public class TestIter
 
     @Test
     public void map_01() {
-        Iterator<String> it = Iter.map(data2.iterator(), item -> item + item);
+        Iterator<String> it = Iter.map(data2.iterator(), TestIter::strAction);
         test(it, "xx", "yy", "zz");
     }
 
     @Test
     public void map_02() {
-        Iterator<String> it = Iter.map(data2.iterator(), item -> item + item);
+        Iterator<String> it = Iter.map(data2.iterator(), TestIter::strAction);
         testWithForeachRemaining(it, "xx", "yy", "zz");
     }
 
+    @Test
+    public void mapRemove_01() {
+        List<String> input = List.of();
+        Iterator<String> output = Iter.mapRemove(input.iterator(), 
TestIter::strActionOrNull);
+        test(output);
+    }
+
+    @Test
+    public void mapRemove_02() {
+        List<String> input = List.of("a", "b");
+        Iterator<String> output = Iter.mapRemove(input.iterator(), 
TestIter::strActionOrNull);
+        test(output, "aa", "bb");
+    }
+
+    @Test
+    public void mapRemove_03() {
+        List<String> input = List.of("!");
+        Iterator<String> output = Iter.mapRemove(input.iterator(), 
TestIter::strActionOrNull);
+        test(output);
+    }
+
+    @Test
+    public void mapRemove_04() {
+        List<String> input = List.of("a", "!", "b");
+        Iterator<String> output = Iter.mapRemove(input.iterator(), 
TestIter::strActionOrNull);
+        test(output, "aa", "bb");
+    }
+
+    private static String strAction(String string) {
+        if ( string == null )
+            return null;
+        return string+string;
+    }
+
+    private static String strActionOrNull(String string) {
+        if ( string == null )
+            return null;
+        if ( string.startsWith("!") )
+            return null;
+        return string+string;
+    }
+
+
     @Test
     public void flatmap_01() {
         Iterator<String> it = Iter.flatMap(data2.iterator(), item -> 
Arrays.asList(item+item, item).iterator());

Reply via email to