]> source.dussan.org Git - jackcess.git/commitdiff
add stream support to Iterable classes; add some unit tests with streaming
authorJames Ahlborn <jtahlborn@yahoo.com>
Fri, 24 Apr 2020 19:55:52 +0000 (19:55 +0000)
committerJames Ahlborn <jtahlborn@yahoo.com>
Fri, 24 Apr 2020 19:55:52 +0000 (19:55 +0000)
git-svn-id: https://svn.code.sf.net/p/jackcess/code/jackcess/trunk@1321 f203690c-595d-4dc9-a70b-905162fa7fd2

12 files changed:
src/main/java/com/healthmarketscience/jackcess/Cursor.java
src/main/java/com/healthmarketscience/jackcess/Database.java
src/main/java/com/healthmarketscience/jackcess/PropertyMap.java
src/main/java/com/healthmarketscience/jackcess/Table.java
src/main/java/com/healthmarketscience/jackcess/util/EntryIterableBuilder.java
src/main/java/com/healthmarketscience/jackcess/util/IterableBuilder.java
src/main/java/com/healthmarketscience/jackcess/util/OleBlob.java
src/main/java/com/healthmarketscience/jackcess/util/RowFilter.java
src/main/java/com/healthmarketscience/jackcess/util/TableIterableBuilder.java
src/test/java/com/healthmarketscience/jackcess/CursorTest.java
src/test/java/com/healthmarketscience/jackcess/DatabaseTest.java
src/test/java/com/healthmarketscience/jackcess/util/JoinerTest.java

index 2d0c9f74eaedb0578e31fda57137b151552692c7..89fec96b880d3802947556dcfdfc296980127d99 100644 (file)
@@ -20,6 +20,8 @@ import java.io.IOException;
 import java.util.Collection;
 import java.util.Iterator;
 import java.util.Map;
+import java.util.stream.Stream;
+import java.util.stream.StreamSupport;
 
 import com.healthmarketscience.jackcess.util.ColumnMatcher;
 import com.healthmarketscience.jackcess.util.ErrorHandler;
@@ -143,6 +145,13 @@ public interface Cursor extends Iterable<Row>
   @Override
   public Iterator<Row> iterator();
 
+  /**
+   * @return a Stream using the default Iterator.
+   */
+  default public Stream<Row> stream() {
+    return StreamSupport.stream(spliterator(), false);
+  }
+
   /**
    * Convenience method for constructing a new IterableBuilder for this
    * cursor.  An IterableBuilder provides a variety of options for more
@@ -174,7 +183,7 @@ public interface Cursor extends Iterable<Row>
    * @throws IllegalStateException if the current row is not valid (at
    *         beginning or end of table), or deleted.
    */
-  public <M extends Map<String,Object>> M updateCurrentRowFromMap(M row) 
+  public <M extends Map<String,Object>> M updateCurrentRowFromMap(M row)
     throws IOException;
 
   /**
@@ -190,7 +199,7 @@ public interface Cursor extends Iterable<Row>
    * @return The next row in this table (Column name -&gt; Column value), or
    *         {@code null} if no next row is found
    */
-  public Row getNextRow(Collection<String> columnNames) 
+  public Row getNextRow(Collection<String> columnNames)
     throws IOException;
 
   /**
@@ -206,7 +215,7 @@ public interface Cursor extends Iterable<Row>
    * @return The previous row in this table (Column name -&gt; Column value), or
    *         {@code null} if no previous row is found
    */
-  public Row getPreviousRow(Collection<String> columnNames) 
+  public Row getPreviousRow(Collection<String> columnNames)
     throws IOException;
 
   /**
@@ -222,11 +231,11 @@ public interface Cursor extends Iterable<Row>
    *         otherwise
    */
   public boolean moveToPreviousRow() throws IOException;
-  
+
   /**
    * Moves to the row with the given rowId.  If the row is not found (or an
    * exception is thrown), the cursor is restored to its previous state.
-   * 
+   *
    * @return {@code true} if a valid row was found with the given id,
    *         {@code false} if no row was found
    */
@@ -356,14 +365,14 @@ public interface Cursor extends Iterable<Row>
    * Savepoint.
    */
   public interface Id
-  {    
+  {
   }
 
   /**
    * Value object which maintains the current position of the cursor.
    */
   public interface Position
-  {    
+  {
     /**
      * Returns the unique RowId of the position of the cursor.
      */
index 7ce592827b17805c76bf01c0c4575d5bf6adcbec..7a27f69267b96a5d79eae6187f3b86c9be79c87a 100644 (file)
@@ -29,6 +29,8 @@ import java.util.List;
 import java.util.Map;
 import java.util.Set;
 import java.util.TimeZone;
+import java.util.stream.Stream;
+import java.util.stream.StreamSupport;
 
 import com.healthmarketscience.jackcess.expr.EvalConfig;
 import com.healthmarketscience.jackcess.impl.DatabaseImpl;
@@ -218,6 +220,13 @@ public interface Database extends Iterable<Table>, Closeable, Flushable
   @Override
   public Iterator<Table> iterator();
 
+  /**
+   * @return a Stream using the default Iterator.
+   */
+  default public Stream<Table> stream() {
+    return StreamSupport.stream(spliterator(), false);
+  }
+
   /**
    * Convenience method for constructing a new TableIterableBuilder for this
    * cursor.  A TableIterableBuilder provides a variety of options for more
@@ -236,6 +245,14 @@ public interface Database extends Iterable<Table>, Closeable, Flushable
    */
   public Iterable<TableMetaData> newTableMetaDataIterable();
 
+  /**
+   * @return a Stream using the {@link #newTableMetaDataIterable}
+   */
+  default public Stream<TableMetaData> newTableMetaDataStream() {
+    return StreamSupport.stream(
+        newTableMetaDataIterable().spliterator(), false);
+  }
+
   /**
    * @param name User table name (case-insensitive)
    * @return The Table, or null if it doesn't exist (or is a system table)
index 7ff920b5c858962c675ff7110c119c0ab0bda731..6ef36752dd8b27236f50263f3f509519243867b8 100644 (file)
@@ -17,6 +17,8 @@ limitations under the License.
 package com.healthmarketscience.jackcess;
 
 import java.io.IOException;
+import java.util.stream.Stream;
+import java.util.stream.StreamSupport;
 
 /**
  * Map of properties for a database object.
@@ -130,6 +132,13 @@ public interface PropertyMap extends Iterable<PropertyMap.Property>
    */
   public void save() throws IOException;
 
+  /**
+   * @return a Stream using the default Iterator.
+   */
+  default public Stream<PropertyMap.Property> stream() {
+    return StreamSupport.stream(spliterator(), false);
+  }
+
   /**
    * Info about a property defined in a PropertyMap.
    */
index c1d1ddd42df88961578e692ff5479fe4bc56d341..8c6e43b957a0fffc4f433fc033dc199dedfa4f99 100644 (file)
@@ -20,6 +20,8 @@ import java.io.IOException;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
+import java.util.stream.Stream;
+import java.util.stream.StreamSupport;
 
 import com.healthmarketscience.jackcess.util.ErrorHandler;
 
@@ -49,7 +51,7 @@ public interface Table extends Iterable<Row>
   public enum ColumnOrder {
     /** columns are ordered based on the order of the data in the table (this
         order does not change as columns are added to the table). */
-    DATA, 
+    DATA,
     /** columns are ordered based on the "display" order (this order can be
         changed arbitrarily) */
     DISPLAY;
@@ -209,7 +211,7 @@ public interface Table extends Iterable<Row>
    * @return the given row map, which will contain any autonumbers generated
    * @usage _general_method_
    */
-  public <M extends Map<String,Object>> M addRowFromMap(M row) 
+  public <M extends Map<String,Object>> M addRowFromMap(M row)
     throws IOException;
 
   /**
@@ -226,7 +228,7 @@ public interface Table extends Iterable<Row>
    * partially successful write.
    *
    * @see #addRow(Object...) for more details on row arrays
-   * 
+   *
    * @param rows List of Object[] row values.  the rows will be modified if
    *             this table contains an auto-number column, otherwise they
    *             will not be modified.
@@ -236,7 +238,7 @@ public interface Table extends Iterable<Row>
    *         generated
    * @usage _general_method_
    */
-  public List<? extends Object[]> addRows(List<? extends Object[]> rows) 
+  public List<? extends Object[]> addRows(List<? extends Object[]> rows)
     throws IOException;
 
   /**
@@ -249,12 +251,12 @@ public interface Table extends Iterable<Row>
    * Most exceptions thrown from this method will be wrapped with a {@link
    * BatchUpdateException} which gives useful information in the case of a
    * partially successful write.
-   * 
+   *
    * @return the given row map list, where the row maps will contain any
    *         autonumbers generated
    * @usage _general_method_
    */
-  public <M extends Map<String,Object>> List<M> addRowsFromMaps(List<M> rows) 
+  public <M extends Map<String,Object>> List<M> addRowsFromMaps(List<M> rows)
     throws IOException;
 
   /**
@@ -288,6 +290,13 @@ public interface Table extends Iterable<Row>
   @Override
   public Iterator<Row> iterator();
 
+  /**
+   * @return a Stream using the default Iterator.
+   */
+  default public Stream<Row> stream() {
+    return StreamSupport.stream(spliterator(), false);
+  }
+
   /**
    * After calling this method, {@link #getNextRow} will return the first row
    * in the table, see {@link Cursor#reset} (uses the {@link #getDefaultCursor
index 220d525844b7b5cc2c1f192971948f4ae5c35cda..0337e343255143fdc0c947e2af3e0a21a3e68633 100644 (file)
@@ -19,6 +19,8 @@ package com.healthmarketscience.jackcess.util;
 import java.util.Collection;
 import java.util.HashSet;
 import java.util.Iterator;
+import java.util.stream.Stream;
+import java.util.stream.StreamSupport;
 
 import com.healthmarketscience.jackcess.Column;
 import com.healthmarketscience.jackcess.IndexCursor;
@@ -109,5 +111,12 @@ public class EntryIterableBuilder implements Iterable<Row>
   @Override
   public Iterator<Row> iterator() {
     return ((IndexCursorImpl)_cursor).entryIterator(this);
-  }  
+  }
+
+  /**
+   * @return a Stream using the default Iterator.
+   */
+  public Stream<Row> stream() {
+    return StreamSupport.stream(spliterator(), false);
+  }
 }
index 38651523455351ebb6bfbc1243342a7ccd0f8159..91c8b4f632d4d716de08e26bd21891a40ac13e78 100644 (file)
@@ -22,6 +22,8 @@ import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Iterator;
 import java.util.Map;
+import java.util.stream.Stream;
+import java.util.stream.StreamSupport;
 
 import com.healthmarketscience.jackcess.Column;
 import com.healthmarketscience.jackcess.Cursor;
@@ -139,7 +141,7 @@ public class IterableBuilder implements Iterable<Row>
     _columnNames.add(columnName);
   }
 
-  public IterableBuilder setMatchPattern(Column columnPattern, 
+  public IterableBuilder setMatchPattern(Column columnPattern,
                                          Object valuePattern) {
     _type = Type.COLUMN_MATCH;
     _matchPattern = new AbstractMap.SimpleImmutableEntry<Column,Object>(
@@ -147,7 +149,7 @@ public class IterableBuilder implements Iterable<Row>
     return this;
   }
 
-  public IterableBuilder setMatchPattern(String columnNamePattern, 
+  public IterableBuilder setMatchPattern(String columnNamePattern,
                                          Object valuePattern) {
     return setMatchPattern(_cursor.getTable().getColumn(columnNamePattern),
                            valuePattern);
@@ -159,7 +161,7 @@ public class IterableBuilder implements Iterable<Row>
     return this;
   }
 
-  public IterableBuilder addMatchPattern(String columnNamePattern, 
+  public IterableBuilder addMatchPattern(String columnNamePattern,
                                          Object valuePattern)
   {
     _type = Type.ROW_MATCH;
@@ -171,7 +173,7 @@ public class IterableBuilder implements Iterable<Row>
     }
     matchPattern.put(columnNamePattern, valuePattern);
     return this;
-  }    
+  }
 
   public IterableBuilder setColumnMatcher(ColumnMatcher columnMatcher) {
     _columnMatcher = columnMatcher;
@@ -182,4 +184,11 @@ public class IterableBuilder implements Iterable<Row>
   public Iterator<Row> iterator() {
     return ((CursorImpl)_cursor).iterator(this);
   }
+
+  /**
+   * @return a Stream using the default Iterator.
+   */
+  public Stream<Row> stream() {
+    return StreamSupport.stream(spliterator(), false);
+  }
 }
index a84f1229e3268a90eb4d0ae0e974b277f7c78c77..74bf4584559cc192cfdaf267fb2ed2815176bfb5 100644 (file)
@@ -24,6 +24,8 @@ import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
 import java.sql.Blob;
+import java.util.stream.Stream;
+import java.util.stream.StreamSupport;
 
 import com.healthmarketscience.jackcess.impl.OleUtil;
 
@@ -64,7 +66,7 @@ import com.healthmarketscience.jackcess.impl.OleUtil;
  *     }
  *   } finally {
  *     if(oleBlob != null) { oleBlob.close(); }
- *   }     
+ *   }
  * </pre>
  * <p>
  * <b>Example for creating new, embedded ole data:</b>
@@ -77,7 +79,7 @@ import com.healthmarketscience.jackcess.impl.OleUtil;
  *     db.addRow(1, oleBlob);
  *   } finally {
  *     if(oleBlob != null) { oleBlob.close(); }
- *   }     
+ *   }
  * </pre>
  * <p>
  * <b>Example for creating new, linked ole data:</b>
@@ -90,7 +92,7 @@ import com.healthmarketscience.jackcess.impl.OleUtil;
  *     db.addRow(1, oleBlob);
  *   } finally {
  *     if(oleBlob != null) { oleBlob.close(); }
- *   }     
+ *   }
  * </pre>
  *
  * @author James Ahlborn
@@ -102,11 +104,11 @@ public interface OleBlob extends Blob, Closeable
   public enum ContentType {
     /** the blob contents are a link (file path) to some external content.
         Content will be an instance of LinkContent */
-    LINK, 
+    LINK,
     /** the blob contents are a simple wrapper around some embedded content
         and related file names/paths.  Content will be an instance
         SimplePackageContent */
-    SIMPLE_PACKAGE, 
+    SIMPLE_PACKAGE,
     /** the blob contents are a complex embedded data known as compound
         storage (aka OLE2).  Working with compound storage requires the
         optional POI library.  Content will be an instance of CompoundContent.
@@ -119,7 +121,7 @@ public interface OleBlob extends Blob, Closeable
     OTHER,
     /** the top-level blob wrapper is not understood (this may not be a valid
         ole instance).  Content will simply be an instance of Content (the
-        data can be accessed from the main blob instance) */ 
+        data can be accessed from the main blob instance) */
     UNKNOWN;
   }
 
@@ -137,8 +139,8 @@ public interface OleBlob extends Blob, Closeable
   public Content getContent() throws IOException;
 
 
-  public interface Content 
-  {    
+  public interface Content
+  {
     /**
      * Returns the type of this content.
      */
@@ -154,7 +156,7 @@ public interface OleBlob extends Blob, Closeable
    * Intermediate sub-interface for Content which has a nested package.
    */
   public interface PackageContent extends Content
-  {    
+  {
     public String getPrettyName() throws IOException;
 
     public String getClassName() throws IOException;
@@ -171,7 +173,7 @@ public interface OleBlob extends Blob, Closeable
 
     public InputStream getStream() throws IOException;
 
-    public void writeTo(OutputStream out) throws IOException;    
+    public void writeTo(OutputStream out) throws IOException;
   }
 
   /**
@@ -196,7 +198,7 @@ public interface OleBlob extends Blob, Closeable
    * the access database (but the original file source path can also be found
    * at {@link #getFilePath}).
    */
-  public interface SimplePackageContent 
+  public interface SimplePackageContent
     extends PackageContent, EmbeddedContent
   {
     public String getFileName();
@@ -228,6 +230,13 @@ public interface OleBlob extends Blob, Closeable
 
     public Entry getContentsEntry() throws IOException;
 
+    /**
+     * @return a Stream using the default Iterator.
+     */
+    default public Stream<CompoundContent.Entry> stream() {
+      return StreamSupport.stream(spliterator(), false);
+    }
+
     /**
      * A document entry in the compound storage.
      */
@@ -240,7 +249,7 @@ public interface OleBlob extends Blob, Closeable
        */
       public CompoundContent getParent();
     }
-  }  
+  }
 
   /**
    * Sub-interface for Content which has the {@link ContentType#OTHER} type.
@@ -269,7 +278,7 @@ public interface OleBlob extends Blob, Closeable
     private String _prettyName;
     private String _className;
     private String _typeName;
-    
+
     public ContentType getType() {
       return _type;
     }
@@ -301,11 +310,11 @@ public interface OleBlob extends Blob, Closeable
     public String getClassName() {
       return _className;
     }
-    
+
     public String getTypeName() {
       return _typeName;
     }
-    
+
     public Builder setSimplePackageBytes(byte[] bytes) {
       _bytes = bytes;
       _contentLen = bytes.length;
index 35b7609666c019736461a94d073000af7fb35425..8e14529b0856ddaf6658614ef88d1223b62266f2 100644 (file)
@@ -20,6 +20,9 @@ import java.util.Iterator;
 import java.util.Map;
 import java.util.NoSuchElementException;
 import java.util.Objects;
+import java.util.function.Predicate;
+import java.util.stream.Stream;
+import java.util.stream.StreamSupport;
 
 import com.healthmarketscience.jackcess.Column;
 import com.healthmarketscience.jackcess.Row;
@@ -33,7 +36,7 @@ import com.healthmarketscience.jackcess.Row;
  * @author Patricia Donaldson, Xerox Corporation
  * @usage _general_class_
  */
-public abstract class RowFilter
+public abstract class RowFilter implements Predicate<Row>
 {
 
   /**
@@ -43,6 +46,15 @@ public abstract class RowFilter
    */
   public abstract boolean matches(Row row);
 
+  /**
+   * Adaptation of this class for {@link Predicate} support.  Uses the
+   * {@link #matches} method.
+   */
+  @Override
+  public boolean test(Row row) {
+    return matches(row);
+  }
+
   /**
    * Returns an iterable which filters the given iterable based on this
    * filter.
@@ -56,6 +68,15 @@ public abstract class RowFilter
     return new FilterIterable(iterable);
   }
 
+  /**
+   * Convenience method to apply this filter to the given iterable and return
+   * it as a Stream.
+   */
+  public Stream<Row> filter(Iterable<? extends Row> iterable) {
+    return StreamSupport.stream(
+        new FilterIterable(iterable).spliterator(), false)
+      .filter(this);
+  }
 
   /**
    * Creates a filter based on a row pattern.
index da6d1b57a2f3a599f14ac1c7bab42a99e234c773..d4772a4fd4c5ab2b719587866b2684bffd77c51e 100644 (file)
@@ -17,6 +17,8 @@ limitations under the License.
 package com.healthmarketscience.jackcess.util;
 
 import java.util.Iterator;
+import java.util.stream.Stream;
+import java.util.stream.StreamSupport;
 
 import com.healthmarketscience.jackcess.Database;
 import com.healthmarketscience.jackcess.Table;
@@ -36,7 +38,7 @@ public class TableIterableBuilder implements Iterable<Table>
   private boolean _includeNormalTables = true;
   private boolean _includeSystemTables;
   private boolean _includeLinkedTables = true;
-  
+
   public TableIterableBuilder(Database db) {
     _db = db;
   }
@@ -44,20 +46,20 @@ public class TableIterableBuilder implements Iterable<Table>
   public boolean isIncludeNormalTables() {
     return _includeNormalTables;
   }
-  
+
   public boolean isIncludeSystemTables() {
     return _includeSystemTables;
   }
-  
+
   public boolean isIncludeLinkedTables() {
     return _includeLinkedTables;
   }
-  
+
   public TableIterableBuilder setIncludeNormalTables(boolean includeNormalTables) {
     _includeNormalTables = includeNormalTables;
     return this;
   }
-  
+
   public TableIterableBuilder setIncludeSystemTables(boolean includeSystemTables) {
     _includeSystemTables = includeSystemTables;
     return this;
@@ -77,7 +79,7 @@ public class TableIterableBuilder implements Iterable<Table>
     setIncludeSystemTables(false);
     return setIncludeLinkedTables(false);
   }
-  
+
   /**
    * Convenience method to set the flags to include only system tables.
    */
@@ -86,9 +88,16 @@ public class TableIterableBuilder implements Iterable<Table>
     setIncludeSystemTables(true);
     return setIncludeLinkedTables(false);
   }
-  
+
   @Override
   public Iterator<Table> iterator() {
     return ((DatabaseImpl)_db).iterator(this);
   }
+
+  /**
+   * @return a Stream using the default Iterator.
+   */
+  public Stream<Table> stream() {
+    return StreamSupport.stream(spliterator(), false);
+  }
 }
index e108ae4dadf7c455466ed808890b46e5c1413efb..c208605d71040e5e8999dc25b659f7aa8cc22644 100644 (file)
@@ -24,6 +24,7 @@ import java.util.List;
 import java.util.Map;
 import java.util.NoSuchElementException;
 import java.util.TreeSet;
+import java.util.stream.Collectors;
 
 import static com.healthmarketscience.jackcess.Database.*;
 import com.healthmarketscience.jackcess.impl.ColumnImpl;
@@ -1102,11 +1103,10 @@ public class CursorTest extends TestCase {
       Index idx = t1.getIndex("Table2Table1");
       IndexCursor cursor = CursorBuilder.createCursor(idx);
 
-      List<String> expectedData = new ArrayList<String>();
-      for(Row row : cursor.newEntryIterable(1)
-            .addColumnNames("data")) {
-        expectedData.add(row.getString("data"));
-      }
+      List<String> expectedData = cursor.newEntryIterable(1)
+            .addColumnNames("data")
+        .stream().map(r -> r.getString("data"))
+        .collect(Collectors.toList());
 
       assertEquals(Arrays.asList("baz11", "baz11-2"), expectedData);
 
@@ -1155,13 +1155,11 @@ public class CursorTest extends TestCase {
       Table t1 = db.getTable("Table1");
       Cursor cursor = CursorBuilder.createCursor(t1);
 
-      List<String> expectedData = new ArrayList<String>();
-      for(Row row : cursor.newIterable().setColumnNames(
-              Arrays.asList("otherfk1", "data"))) {
-        if(row.get("otherfk1").equals(1)) {
-          expectedData.add(row.getString("data"));
-        }
-      }
+      List<String> expectedData = cursor.newIterable().setColumnNames(
+              Arrays.asList("otherfk1", "data")).stream()
+        .filter(r -> r.get("otherfk1").equals(1))
+        .map(r -> r.getString("data"))
+        .collect(Collectors.toList());
 
       assertEquals(Arrays.asList("baz11", "baz11-2"), expectedData);
 
index 2e5c35eed8d9d0432554e149cbccf2ea8c99ce25..e2e16e550e6a3ba410d1436d2d6e912c59417aa5 100644 (file)
@@ -35,6 +35,7 @@ import java.util.Set;
 import java.util.TimeZone;
 import java.util.TreeSet;
 import java.util.UUID;
+import java.util.stream.Collectors;
 
 import static com.healthmarketscience.jackcess.Database.*;
 import com.healthmarketscience.jackcess.impl.ColumnImpl;
@@ -571,10 +572,9 @@ public class DatabaseTest extends TestCase
         ((DatabaseImpl)db).getPageChannel().finishWrite();
       }
 
-      Set<Integer> ids = new HashSet<Integer>();
-      for(Row row : t) {
-        ids.add(row.getInt("ID"));
-      }
+      Set<Integer> ids = t.stream()
+        .map(r -> r.getInt("ID"))
+        .collect(Collectors.toSet());
       assertEquals(1000, ids.size());
 
       assertTrue(((TableImpl)t).getOwnedPagesCursor().getUsageMap().toString()
@@ -666,10 +666,9 @@ public class DatabaseTest extends TestCase
         ((DatabaseImpl)db).getPageChannel().finishWrite();
       }
 
-      List<Date> foundDates = new ArrayList<Date>();
-      for(Row row : table) {
-        foundDates.add(row.getDate("date"));
-      }
+      List<Date> foundDates = table.stream()
+        .map(r -> r.getDate("date"))
+        .collect(Collectors.toList());
 
       assertEquals(dates.size(), foundDates.size());
       for(int i = 0; i < dates.size(); ++i) {
@@ -706,10 +705,9 @@ public class DatabaseTest extends TestCase
         table.addRow("row " + dateStr, d);
       }
 
-      List<String> foundDates = new ArrayList<String>();
-      for(Row row : table) {
-        foundDates.add(sdf.format(row.getDate("date")));
-      }
+      List<String> foundDates = table.stream()
+        .map(r -> sdf.format(r.getDate("date")))
+        .collect(Collectors.toList());
 
       assertEquals(dates, foundDates);
 
index 986c8b555afe041382fbedfa27f781f9a11462e3..51017d6c4393f1e330dfa8100c37236712f2aaba 100644 (file)
@@ -23,6 +23,7 @@ import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
+import java.util.stream.Collectors;
 
 import com.healthmarketscience.jackcess.Database;
 import com.healthmarketscience.jackcess.Index;
@@ -63,9 +64,9 @@ public class JoinerTest extends TestCase {
       assertSame(t2t1, t2t1Join.getFromIndex());
       assertSame(t1, t2t1Join.getToTable());
       assertSame(t1t2, t2t1Join.getToIndex());
-      
+
       doTestJoiner(t2t1Join, createT2T1Data());
-      
+
       Index t3t1 = t1t3.getReferencedIndex();
       assertSame(t3, t3t1.getTable());
       Joiner t3t1Join = Joiner.create(t3t1);
@@ -74,11 +75,11 @@ public class JoinerTest extends TestCase {
       assertSame(t3t1, t3t1Join.getFromIndex());
       assertSame(t1, t3t1Join.getToTable());
       assertSame(t1t3, t3t1Join.getToIndex());
-      
-      doTestJoiner(t3t1Join, createT3T1Data());      
+
+      doTestJoiner(t3t1Join, createT3T1Data());
 
       doTestJoinerDelete(t2t1Join);
-    }    
+    }
   }
 
   private static void doTestJoiner(
@@ -92,11 +93,8 @@ public class JoinerTest extends TestCase {
     for(Row row : join.getFromTable()) {
       Integer id = row.getInt("id");
 
-      List<Row> joinedRows =
-        new ArrayList<Row>();
-      for(Row t1Row : join.findRows(row)) {
-        joinedRows.add(t1Row);
-      }
+      List<Row> joinedRows = join.findRows(row).stream()
+        .collect(Collectors.toList());
 
       List<Row> expectedRows = expectedData.get(id);
       assertEquals(expectedData.get(id), joinedRows);
@@ -110,18 +108,16 @@ public class JoinerTest extends TestCase {
         assertFalse(join.hasRows(row));
         assertNull(join.findFirstRow(row));
       }
-      
+
       List<Row> expectedRows2 = new ArrayList<Row>();
       for(Row tmpRow : expectedRows) {
         Row tmpRow2 = new RowImpl(tmpRow);
         tmpRow2.keySet().retainAll(colNames);
         expectedRows2.add(tmpRow2);
       }
-      
-      joinedRows = new ArrayList<Row>();
-      for(Row t1Row : join.findRows(row).setColumnNames(colNames)) {
-        joinedRows.add(t1Row);
-      }
+
+      joinedRows = join.findRows(row).setColumnNames(colNames)
+        .stream().collect(Collectors.toList());
 
       assertEquals(expectedRows2, joinedRows);
 
@@ -129,7 +125,7 @@ public class JoinerTest extends TestCase {
         assertEquals(expectedRows2.get(0), join.findFirstRow(row, colNames));
       } else {
         assertNull(join.findFirstRow(row, colNames));
-      }      
+      }
     }
   }
 
@@ -175,7 +171,7 @@ public class JoinerTest extends TestCase {
 
     return data;
   }
-  
+
   private static Map<Integer,List<Row>> createT3T1Data()
   {
     Map<Integer,List<Row>> data = new HashMap<Integer,List<Row>>();
@@ -202,5 +198,5 @@ public class JoinerTest extends TestCase {
 
     return data;
   }
-  
+
 }