You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@polygene.apache.org by ni...@apache.org on 2015/08/26 17:45:22 UTC

[19/24] zest-java git commit: ZEST-118; Massive update of removing the Iterable<> use for type manipulation in the runtime internals and all public APIs of that.

http://git-wip-us.apache.org/repos/asf/zest-java/blob/bd6fbad9/core/runtime/src/main/java/org/apache/zest/runtime/structure/TypeLookup.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/zest/runtime/structure/TypeLookup.java b/core/runtime/src/main/java/org/apache/zest/runtime/structure/TypeLookup.java
index db52048..975e7e2 100644
--- a/core/runtime/src/main/java/org/apache/zest/runtime/structure/TypeLookup.java
+++ b/core/runtime/src/main/java/org/apache/zest/runtime/structure/TypeLookup.java
@@ -22,37 +22,32 @@ package org.apache.zest.runtime.structure;
 import java.lang.reflect.ParameterizedType;
 import java.lang.reflect.Type;
 import java.lang.reflect.WildcardType;
-import java.util.ArrayList;
-import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.function.Function;
 import java.util.function.Predicate;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
 import org.apache.zest.api.composite.AmbiguousTypeException;
 import org.apache.zest.api.composite.ModelDescriptor;
 import org.apache.zest.api.service.NoSuchServiceException;
 import org.apache.zest.api.service.ServiceReference;
-import org.apache.zest.functional.Specifications;
+import org.apache.zest.runtime.legacy.Specifications;
 import org.apache.zest.runtime.composite.TransientModel;
 import org.apache.zest.runtime.entity.EntityModel;
 import org.apache.zest.runtime.object.ObjectModel;
 import org.apache.zest.runtime.value.ValueModel;
 import org.apache.zest.spi.module.ModelModule;
 
+import static java.util.stream.Stream.concat;
 import static org.apache.zest.api.common.Visibility.application;
 import static org.apache.zest.api.common.Visibility.layer;
 import static org.apache.zest.api.common.Visibility.module;
 import static org.apache.zest.api.util.Classes.RAW_CLASS;
 import static org.apache.zest.api.util.Classes.interfacesOf;
 import static org.apache.zest.functional.Iterables.cast;
-import static org.apache.zest.functional.Iterables.filter;
 import static org.apache.zest.functional.Iterables.first;
-import static org.apache.zest.functional.Iterables.flatten;
-import static org.apache.zest.functional.Iterables.flattenIterables;
-import static org.apache.zest.functional.Iterables.iterable;
-import static org.apache.zest.functional.Iterables.toList;
-import static org.apache.zest.functional.Iterables.unique;
 
 /**
  * Central place for Composite Type lookups.
@@ -66,7 +61,7 @@ public class TypeLookup
     private final Map<Class<?>, ModelModule<ObjectModel>> objectModels;
     private final Map<Class<?>, ModelModule<TransientModel>> transientModels;
     private final Map<Class<?>, ModelModule<ValueModel>> valueModels;
-    private final Map<Class<?>, Iterable<ModelModule<EntityModel>>> allEntityModels;
+    private final Map<Class<?>, List<ModelModule<EntityModel>>> allEntityModels;
     private final Map<Class<?>, ModelModule<EntityModel>> unambiguousEntityModels;
     private final Map<Type, ServiceReference<?>> serviceReferences;
     private final Map<Type, Iterable<ServiceReference<?>>> servicesReferences;
@@ -114,7 +109,7 @@ public class TypeLookup
         if( model == null )
         {
             // Unambiguously and lazily resolve ObjectModel
-            Iterable<ModelModule<ObjectModel>> flatten = flatten(
+            Stream<ModelModule<? extends ModelDescriptor>> models = concat(
                 ambiguousTypeCheck( type,
                                     findModels( new ExactTypeLookupSpecification( type ),
                                                 moduleInstance.visibleObjects( module ),
@@ -123,16 +118,19 @@ public class TypeLookup
                                                 moduleInstance.layerInstance()
                                                     .usedLayersInstance()
                                                     .visibleObjects() ) ),
+
                 ambiguousTypeCheck( type,
                                     findModels( new AssignableTypeLookupSpecification( type ),
                                                 moduleInstance.visibleObjects( module ),
-                                                moduleInstance.layerInstance().visibleObjects( layer ),
-                                                moduleInstance.layerInstance().visibleObjects( application ),
+                                                moduleInstance.layerInstance()
+                                                    .visibleObjects( layer ),
+                                                moduleInstance.layerInstance()
+                                                    .visibleObjects( application ),
                                                 moduleInstance.layerInstance()
                                                     .usedLayersInstance()
                                                     .visibleObjects() ) ) );
 
-            model = first( flatten );
+            model = (ModelModule<ObjectModel>) models.findFirst().orElse( null );
 
             if( model != null )
             {
@@ -165,34 +163,35 @@ public class TypeLookup
 
         if( model == null )
         {
-            // Unambiguously and lazily resolve TransientModel
-            Iterable<ModelModule<TransientModel>> allModels = flatten(
+            // Unambiguously and lazily resolve ObjectModel
+            Stream<ModelModule<? extends ModelDescriptor>> models = concat(
                 ambiguousTypeCheck( type,
                                     findModels( new ExactTypeLookupSpecification( type ),
                                                 moduleInstance.visibleTransients( module ),
                                                 moduleInstance.layerInstance().visibleTransients( layer ),
                                                 moduleInstance.layerInstance().visibleTransients( application ),
-                                                moduleInstance.layerInstance().usedLayersInstance().visibleTransients()
-                                    )
-                ),
+                                                moduleInstance.layerInstance()
+                                                    .usedLayersInstance()
+                                                    .visibleTransients() ) ),
 
                 ambiguousTypeCheck( type,
                                     findModels( new AssignableTypeLookupSpecification( type ),
                                                 moduleInstance.visibleTransients( module ),
-                                                moduleInstance.layerInstance().visibleTransients( layer ),
-                                                moduleInstance.layerInstance().visibleTransients( application ),
-                                                moduleInstance.layerInstance().usedLayersInstance().visibleTransients()
-                                    )
-                )
-            );
-            model = first( allModels );
+                                                moduleInstance.layerInstance()
+                                                    .visibleTransients( layer ),
+                                                moduleInstance.layerInstance()
+                                                    .visibleTransients( application ),
+                                                moduleInstance.layerInstance()
+                                                    .usedLayersInstance()
+                                                    .visibleTransients() ) ) );
+
+            model = (ModelModule<TransientModel>) models.findFirst().orElse( null );
 
             if( model != null )
             {
                 transientModels.put( type, model );
             }
         }
-
         return model;
     }
 
@@ -218,25 +217,29 @@ public class TypeLookup
 
         if( model == null )
         {
-            // Unambiguously and lazily resolve ValueModel
-            Iterable<ModelModule<ValueModel>> flatten = flatten(
+            // Unambiguously and lazily resolve ObjectModel
+            Stream<ModelModule<? extends ModelDescriptor>> models = concat(
                 ambiguousTypeCheck( type,
                                     findModels( new ExactTypeLookupSpecification( type ),
                                                 moduleInstance.visibleValues( module ),
                                                 moduleInstance.layerInstance().visibleValues( layer ),
                                                 moduleInstance.layerInstance().visibleValues( application ),
-                                                moduleInstance.layerInstance().usedLayersInstance().visibleValues() ) ),
+                                                moduleInstance.layerInstance()
+                                                    .usedLayersInstance()
+                                                    .visibleValues() ) ),
+
                 ambiguousTypeCheck( type,
                                     findModels( new AssignableTypeLookupSpecification( type ),
                                                 moduleInstance.visibleValues( module ),
-                                                moduleInstance.layerInstance().visibleValues( layer ),
-                                                moduleInstance.layerInstance().visibleValues( application ),
-                                                moduleInstance.layerInstance().usedLayersInstance().visibleValues()
-                                    )
-                )
-            );
+                                                moduleInstance.layerInstance()
+                                                    .visibleValues( layer ),
+                                                moduleInstance.layerInstance()
+                                                    .visibleValues( application ),
+                                                moduleInstance.layerInstance()
+                                                    .usedLayersInstance()
+                                                    .visibleValues() ) ) );
 
-            model = first( flatten );
+            model = (ModelModule<ValueModel>) models.findFirst().orElse( null );
 
             if( model != null )
             {
@@ -272,8 +275,8 @@ public class TypeLookup
 
         if( model == null )
         {
-            // Unambiguously and lazily resolve EntityModels
-            Iterable<ModelModule<EntityModel>> allModels = flatten(
+            // Unambiguously and lazily resolve ObjectModel
+            Stream<ModelModule<? extends ModelDescriptor>> models = concat(
                 ambiguousTypeCheck( type,
                                     findModels( new ExactTypeLookupSpecification( type ),
                                                 moduleInstance.visibleEntities( module ),
@@ -282,17 +285,19 @@ public class TypeLookup
                                                 moduleInstance.layerInstance()
                                                     .usedLayersInstance()
                                                     .visibleEntities() ) ),
+
                 ambiguousTypeCheck( type,
                                     findModels( new AssignableTypeLookupSpecification( type ),
                                                 moduleInstance.visibleEntities( module ),
-                                                moduleInstance.layerInstance().visibleEntities( layer ),
-                                                moduleInstance.layerInstance().visibleEntities( application ),
-                                                moduleInstance.layerInstance().usedLayersInstance().visibleEntities()
-                                    )
-                )
-            );
+                                                moduleInstance.layerInstance()
+                                                    .visibleEntities( layer ),
+                                                moduleInstance.layerInstance()
+                                                    .visibleEntities( application ),
+                                                moduleInstance.layerInstance()
+                                                    .usedLayersInstance()
+                                                    .visibleEntities() ) ) );
 
-            model = first( allModels );
+            model = (ModelModule<EntityModel>) models.findFirst().orElse( null );
 
             if( model != null )
             {
@@ -325,35 +330,33 @@ public class TypeLookup
      *
      * @return All matching Entity Models
      */
-    @SuppressWarnings( { "raw", "unchecked" } )
     /* package */ Iterable<ModelModule<EntityModel>> lookupEntityModels( final Class type )
     {
-        Iterable<ModelModule<EntityModel>> models = allEntityModels.get( type );
-        if( models == null )
+        List<ModelModule<EntityModel>> result = allEntityModels.get( type );
+        if( result == null )
         {
-            // Ambiguously and lasily resolve EntityModels
-            Iterable<ModelModule<EntityModel>> matchingEntityModels = flatten(
+            // Unambiguously and lazily resolve ObjectModel
+            Stream<ModelModule<? extends ModelDescriptor>> models = concat(
                 ambiguousTypeCheck( type,
                                     findModels( new ExactTypeLookupSpecification( type ),
                                                 moduleInstance.visibleEntities( module ),
                                                 moduleInstance.layerInstance().visibleEntities( layer ),
                                                 moduleInstance.layerInstance().visibleEntities( application ),
-                                                moduleInstance.layerInstance().usedLayersInstance().visibleEntities()
-                                    )
-                ),
+                                                moduleInstance.layerInstance()
+                                                    .usedLayersInstance()
+                                                    .visibleEntities() ) ),
+
                 findModels( new AssignableTypeLookupSpecification( type ),
                             moduleInstance.visibleEntities( module ),
                             moduleInstance.layerInstance().visibleEntities( layer ),
                             moduleInstance.layerInstance().visibleEntities( application ),
-                            moduleInstance.layerInstance().usedLayersInstance().visibleEntities() ) );
+                            moduleInstance.layerInstance().usedLayersInstance().visibleEntities() )
+            ).distinct();
 
-            // Don't return the same EntityModel multiple times
-            matchingEntityModels = unique( matchingEntityModels );
-
-            models = toList( matchingEntityModels );
-            allEntityModels.put( type, models );
+            result = models.map( m -> (ModelModule<EntityModel>) m ).collect( Collectors.toList() );
+            allEntityModels.put( type, result );
         }
-        return models;
+        return result;
     }
 
     /**
@@ -418,7 +421,7 @@ public class TypeLookup
         if( serviceRefs == null )
         {
             // Lazily resolve ServicesReferences
-            Iterable<ServiceReference<?>> matchingServices = flatten(
+            Stream<ServiceReference<?>> matchingServices = concat(
                 findServiceReferences( new ExactTypeLookupSpecification( serviceType ),
                                        moduleInstance.visibleServices( module ),
                                        moduleInstance.layerInstance().visibleServices( layer ),
@@ -428,122 +431,88 @@ public class TypeLookup
                                        moduleInstance.visibleServices( module ),
                                        moduleInstance.layerInstance().visibleServices( layer ),
                                        moduleInstance.layerInstance().visibleServices( application ),
-                                       moduleInstance.layerInstance().usedLayersInstance().visibleServices() ) );
-
-            // Don't return the same ServiceReference multiple times
-            matchingServices = unique( matchingServices );
-
-            serviceRefs = toList( matchingServices );
+                                       moduleInstance.layerInstance().usedLayersInstance().visibleServices() )
+            ).distinct();
+            serviceRefs = matchingServices.collect( Collectors.toList() );
             servicesReferences.put( serviceType, serviceRefs );
         }
 
         return cast( serviceRefs );
     }
 
-    @SuppressWarnings( { "raw", "unchecked" } )
-    private static <T extends ModelDescriptor> Iterable<ModelModule<T>> findModels( Predicate<Iterable<Class<?>>> specification,
-                                                                                    Iterable<ModelModule<T>>... models
+    @SafeVarargs
+    private static Stream<ModelModule<? extends ModelDescriptor>> findModels( Predicate<Stream<Class<?>>> specification,
+                                                                              Stream<ModelModule<? extends ModelDescriptor>>... models
     )
     {
-        Predicate<ModelModule<T>> spec = Specifications.translate( new ModelModuleTypesFunction(), specification );
-        Iterable<ModelModule<T>> flattened = flattenIterables( iterable( models ) );
-        return filter( spec, flattened );
+        Function<ModelModule<? extends ModelDescriptor>, Stream<Class<?>>> function = new ModelModuleTypesFunction();
+        Predicate<ModelModule<? extends ModelDescriptor>> spec = Specifications.translate( function, specification );
+        Stream<ModelModule<? extends ModelDescriptor>> stream = Stream.of( models ).flatMap( flatten -> flatten );
+        return stream.filter( spec );
     }
 
-    @SuppressWarnings( { "raw", "unchecked" } )
-    private static Iterable<ServiceReference<?>> findServiceReferences( Predicate<Iterable<Class<?>>> specification,
-                                                                        Iterable<ServiceReference<?>>... references
+    @SafeVarargs
+    private static Stream<ServiceReference<?>> findServiceReferences( Predicate<Stream<Class<?>>> specification,
+                                                                      Stream<ServiceReference<?>>... references
     )
     {
         Predicate<ServiceReference<?>> spec = Specifications.translate( new ServiceReferenceTypesFunction(), specification );
-        Iterable<ServiceReference<?>> flattened = flattenIterables( iterable( references ) );
-        return filter( spec, flattened );
+        return Stream.of( references ).flatMap( flatten -> flatten ).filter( spec );
     }
 
     /**
      * Check if the list of models contains several ones with the same visibility. If yes, then
      * throw an AmbiguousTypeException
      */
-    @SuppressWarnings( "raw" )
-    private static <T extends ModelDescriptor> Iterable<ModelModule<T>> ambiguousTypeCheck( final Class type,
-                                                                                            final Iterable<ModelModule<T>> models
+    private static Stream<ModelModule<? extends ModelDescriptor>> ambiguousTypeCheck( final Class<?> type,
+                                                                                      Stream<ModelModule<? extends ModelDescriptor>> models
     )
     {
-        return new Iterable<ModelModule<T>>()
-        {
-
-            @Override
-            public Iterator<ModelModule<T>> iterator()
-            {
-                ModelModule<T> current = null;
-                List<ModelModule<T>> ambiguous = null;
-                List<ModelModule<T>> results = new ArrayList<>();
-                for( ModelModule<T> model : models )
-                {
-                    if( current != null && !model.equals( current ) )
-                    {
-                        if( model.model().visibility() == current.model().visibility() )
-                        {
-                            if( ambiguous == null )
-                            {
-                                ambiguous = new ArrayList<>();
-                            }
-                            ambiguous.add( model );
-                        }
-                    }
-                    else
-                    {
-                        current = model;
-                    }
-                    results.add( model );
-                }
-                if( ambiguous != null )
-                {
-                    // Check if we had any ambiguities
-                    ambiguous.add( current );
-                    throw new AmbiguousTypeException( "More than one type matches " + type.getName() + ":" + ambiguous );
-                }
-                // Ambiguity check done, and no ambiguities found. Return results
-                return results.iterator();
-            }
-        };
+        // TODO: Figure out why AmbiguityFinder doesn't implement Function<ModelModule<T>, ModelModule<T>>, when it clearly says it does. Absurd.
+        Function<ModelModule<? extends ModelDescriptor>, ModelModule<? extends ModelDescriptor>> ambiguityFinder = new AmbiguityFinder( type );
+        return models.map( ambiguityFinder );
     }
 
     private static class ModelModuleTypesFunction<T extends ModelDescriptor>
-        implements Function<ModelModule<T>, Iterable<Class<?>>>
+        implements Function<ModelModule<T>, Stream<Class<?>>>
     {
 
         @Override
-        public Iterable<Class<?>> apply( ModelModule<T> modelModule )
+        public Stream<Class<?>> apply( ModelModule<T> modelModule )
         {
             return modelModule.model().types();
         }
     }
 
     private static class ServiceReferenceTypesFunction
-        implements Function<ServiceReference<?>, Iterable<Class<?>>>
+        implements Function<ServiceReference<?>, Stream<Class<?>>>
     {
 
         @Override
-        public Iterable<Class<?>> apply( ServiceReference<?> serviceReference )
+        public Stream<Class<?>> apply( ServiceReference<?> serviceReference )
         {
             return serviceReference.types();
         }
     }
 
-    private static abstract class AbstractTypeLookupSpecification
-        implements Predicate<Iterable<Class<?>>>
+    private static final class ExactTypeLookupSpecification
+        implements Predicate<Stream<Class<?>>>
     {
 
         protected final Type lookedUpType;
 
-        private AbstractTypeLookupSpecification( Type lookedUpType )
+        private ExactTypeLookupSpecification( Type lookedUpType )
         {
             this.lookedUpType = lookedUpType;
         }
 
+        protected boolean checkClassMatch( Class<?> candidate, Class<?> lookedUpType )
+        {
+            return candidate.equals( lookedUpType );
+        }
+
         @Override
-        public final boolean test( Iterable<Class<?>> types )
+        public final boolean test( Stream<Class<?>> types )
         {
             if( lookedUpType instanceof Class )
             {
@@ -562,15 +531,7 @@ public class TypeLookup
                         return false;
                     }
                     // Then check Bar
-                    for( Type intf : interfacesOf( types ) )
-                    {
-                        if( intf.equals( lookedUpType ) )
-                        {
-                            // All parameters are the same - ok!
-                            return true;
-                        }
-                    }
-                    return false;
+                    return interfacesOf( types ).anyMatch( intf -> intf.equals( lookedUpType ) );
                 }
                 else if( lookedUpType instanceof WildcardType )
                 {
@@ -580,50 +541,90 @@ public class TypeLookup
             }
         }
 
-        private boolean checkClassMatch( Iterable<Class<?>> candidates, Class<?> lookedUpType )
+        private boolean checkClassMatch( Stream<Class<?>> candidates, Class<?> lookedUpType )
         {
-            for( Class<?> candidate : candidates )
-            {
-                if( checkClassMatch( candidate, lookedUpType ) )
-                {
-                    return true;
-                }
-            }
-            return false;
+            return candidates.anyMatch( candidate -> checkClassMatch( candidate, lookedUpType ) );
         }
-
-        protected abstract boolean checkClassMatch( Class<?> candidate, Class<?> lookedUpType );
     }
 
-    private static final class ExactTypeLookupSpecification
-        extends AbstractTypeLookupSpecification
+    private static final class AssignableTypeLookupSpecification
+        implements Predicate<Stream<Class<?>>>
     {
 
-        private ExactTypeLookupSpecification( Type lookedupType )
+        protected final Type lookedUpType;
+
+        private AssignableTypeLookupSpecification( Type lookedUpType )
         {
-            super( lookedupType );
+            this.lookedUpType = lookedUpType;
         }
 
-        @Override
         protected boolean checkClassMatch( Class<?> candidate, Class<?> lookedUpType )
         {
-            return candidate.equals( lookedUpType );
+            return !candidate.equals( lookedUpType ) && lookedUpType.isAssignableFrom( candidate );
+        }
+
+        @Override
+        public final boolean test( Stream<Class<?>> types )
+        {
+            if( lookedUpType instanceof Class )
+            {
+                // Straight class assignability check
+                return checkClassMatch( types, (Class) lookedUpType );
+            }
+            else
+            {
+                if( lookedUpType instanceof ParameterizedType )
+                {
+                    // Foo<Bar> check
+                    // First check Foo
+                    ParameterizedType parameterizedType = (ParameterizedType) lookedUpType;
+                    if( !checkClassMatch( types, (Class) parameterizedType.getRawType() ) )
+                    {
+                        return false;
+                    }
+                    // Then check Bar
+                    interfacesOf( types ).anyMatch( intf -> intf.equals( lookedUpType ) );
+                }
+                else if( lookedUpType instanceof WildcardType )
+                {
+                    return true;
+                }
+                return false;
+            }
+        }
+
+        private boolean checkClassMatch( Stream<Class<?>> candidates, Class<?> lookedUpType )
+        {
+            return candidates.anyMatch( candidate -> checkClassMatch( candidate, lookedUpType ) );
         }
     }
 
-    private static final class AssignableTypeLookupSpecification
-        extends AbstractTypeLookupSpecification
+    private static class AmbiguityFinder<T extends ModelDescriptor>
+        implements Function<ModelModule<T>, ModelModule<T>>
     {
+        private ModelModule<T> current = null;
+        private final Class<?> type;
 
-        private AssignableTypeLookupSpecification( Type lookedupType )
+        private AmbiguityFinder( Class<?> type )
         {
-            super( lookedupType );
+            this.type = type;
         }
 
         @Override
-        protected boolean checkClassMatch( Class<?> candidate, Class<?> lookedUpType )
+        public ModelModule<T> apply( ModelModule<T> model )
         {
-            return !candidate.equals( lookedUpType ) && lookedUpType.isAssignableFrom( candidate );
+            if( current != null && !model.equals( current ) )
+            {
+                if( model.model().visibility() == current.model().visibility() )
+                {
+                    throw new AmbiguousTypeException( "More than one type matches " + type.getName() + ": " + current + ", " + model + "]" );
+                }
+            }
+            else
+            {
+                current = model;
+            }
+            return current;
         }
     }
 }

http://git-wip-us.apache.org/repos/asf/zest-java/blob/bd6fbad9/core/runtime/src/main/java/org/apache/zest/runtime/structure/UsedLayersInstance.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/zest/runtime/structure/UsedLayersInstance.java b/core/runtime/src/main/java/org/apache/zest/runtime/structure/UsedLayersInstance.java
index 22f2996..3ebe0d8 100644
--- a/core/runtime/src/main/java/org/apache/zest/runtime/structure/UsedLayersInstance.java
+++ b/core/runtime/src/main/java/org/apache/zest/runtime/structure/UsedLayersInstance.java
@@ -15,8 +15,9 @@
 package org.apache.zest.runtime.structure;
 
 import java.util.List;
-import java.util.function.Function;
+import java.util.stream.Stream;
 import org.apache.zest.api.common.Visibility;
+import org.apache.zest.api.composite.ModelDescriptor;
 import org.apache.zest.api.composite.TransientDescriptor;
 import org.apache.zest.api.entity.EntityDescriptor;
 import org.apache.zest.api.object.ObjectDescriptor;
@@ -24,8 +25,6 @@ import org.apache.zest.api.service.ServiceReference;
 import org.apache.zest.api.value.ValueDescriptor;
 import org.apache.zest.spi.module.ModelModule;
 
-import static org.apache.zest.functional.Iterables.*;
-
 /**
  * JAVADOC
  */
@@ -38,63 +37,33 @@ public final class UsedLayersInstance
         this.usedLayerInstances = usedLayerInstances;
     }
 
-    /* package */ Iterable<ModelModule<ObjectDescriptor>> visibleObjects()
+    /* package */ Stream<ModelModule<? extends ModelDescriptor>> visibleObjects()
     {
-        return flattenIterables( map( new Function<LayerInstance, Iterable<ModelModule<ObjectDescriptor>>>()
-        {
-            @Override
-            public Iterable<ModelModule<ObjectDescriptor>> apply( LayerInstance layerInstance )
-            {
-                return layerInstance.visibleObjects( Visibility.application );
-            }
-        }, usedLayerInstances ) );
+        return usedLayerInstances.stream()
+            .flatMap( layerInstance -> layerInstance.visibleObjects( Visibility.application ) );
     }
 
-    /* package */ Iterable<ModelModule<TransientDescriptor>> visibleTransients()
+    /* package */ Stream<ModelModule<? extends ModelDescriptor>> visibleTransients()
     {
-        return flattenIterables( map( new Function<LayerInstance, Iterable<ModelModule<TransientDescriptor>>>()
-        {
-            @Override
-            public Iterable<ModelModule<TransientDescriptor>> apply( LayerInstance layerInstance )
-            {
-                return layerInstance.visibleTransients( Visibility.application );
-            }
-        }, usedLayerInstances ) );
+        return usedLayerInstances.stream()
+            .flatMap( layerInstance -> layerInstance.visibleTransients( Visibility.application ) );
     }
 
-    /* package */ Iterable<ModelModule<EntityDescriptor>> visibleEntities()
+    /* package */ Stream<ModelModule<? extends ModelDescriptor>> visibleEntities()
     {
-        return flattenIterables( map( new Function<LayerInstance, Iterable<ModelModule<EntityDescriptor>>>()
-        {
-            @Override
-            public Iterable<ModelModule<EntityDescriptor>> apply( LayerInstance layerInstance )
-            {
-                return layerInstance.visibleEntities( Visibility.application );
-            }
-        }, usedLayerInstances ) );
+        return usedLayerInstances.stream()
+            .flatMap( layerInstance -> layerInstance.visibleEntities( Visibility.application ) );
     }
 
-    /* package */ Iterable<ModelModule<ValueDescriptor>> visibleValues()
+    /* package */ Stream<ModelModule<? extends ModelDescriptor>> visibleValues()
     {
-        return flattenIterables( map( new Function<LayerInstance, Iterable<ModelModule<ValueDescriptor>>>()
-        {
-            @Override
-            public Iterable<ModelModule<ValueDescriptor>> apply( LayerInstance layerInstance )
-            {
-                return layerInstance.visibleValues( Visibility.application );
-            }
-        }, usedLayerInstances ) );
+        return usedLayerInstances.stream()
+            .flatMap( layerInstance -> layerInstance.visibleValues( Visibility.application ) );
     }
 
-    /* package */ Iterable<ServiceReference<?>> visibleServices()
+    /* package */ Stream<ServiceReference<?>> visibleServices()
     {
-        return flattenIterables( map( new Function<LayerInstance, Iterable<ServiceReference<?>>>()
-        {
-            @Override
-            public Iterable<ServiceReference<?>> apply( LayerInstance layerInstance )
-            {
-                return layerInstance.visibleServices( Visibility.application );
-            }
-        }, usedLayerInstances ) );
+        return usedLayerInstances.stream()
+            .flatMap( layerInstance -> layerInstance.visibleServices( Visibility.application ) );
     }
 }

http://git-wip-us.apache.org/repos/asf/zest-java/blob/bd6fbad9/core/runtime/src/main/java/org/apache/zest/runtime/types/ValueTypeFactory.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/zest/runtime/types/ValueTypeFactory.java b/core/runtime/src/main/java/org/apache/zest/runtime/types/ValueTypeFactory.java
index 4626105..6836d34 100644
--- a/core/runtime/src/main/java/org/apache/zest/runtime/types/ValueTypeFactory.java
+++ b/core/runtime/src/main/java/org/apache/zest/runtime/types/ValueTypeFactory.java
@@ -21,6 +21,8 @@ package org.apache.zest.runtime.types;
 import java.lang.reflect.ParameterizedType;
 import java.lang.reflect.Type;
 import java.lang.reflect.TypeVariable;
+import java.util.ArrayList;
+import java.util.List;
 import org.apache.zest.api.common.InvalidApplicationException;
 import org.apache.zest.api.common.MetaInfo;
 import org.apache.zest.api.common.Visibility;
@@ -33,8 +35,6 @@ import org.apache.zest.api.type.ValueType;
 import org.apache.zest.api.util.Classes;
 import org.apache.zest.api.value.ValueComposite;
 import org.apache.zest.functional.HierarchicalVisitorAdapter;
-import org.apache.zest.functional.Iterables;
-import org.apache.zest.functional.Specifications;
 import org.apache.zest.runtime.association.AssociationsModel;
 import org.apache.zest.runtime.association.ManyAssociationsModel;
 import org.apache.zest.runtime.association.NamedAssociationsModel;
@@ -57,7 +57,7 @@ public class ValueTypeFactory
         return instance;
     }
 
-    @SuppressWarnings( {"raw", "unchecked"} )
+    @SuppressWarnings( { "raw", "unchecked" } )
     public ValueType newValueType( Type type,
                                    Class declaringClass,
                                    Class compositeType,
@@ -126,7 +126,8 @@ public class ValueTypeFactory
                 {
                     // Create default model
                     MixinsModel mixinsModel = new MixinsModel();
-                    Iterable valueComposite = (Iterable) Iterables.iterable( ValueComposite.class );
+                    List<Class<?>> valueComposite = new ArrayList<>();
+                    valueComposite.add( ValueComposite.class );
                     ValueStateModel valueStateModel = new ValueStateModel( new PropertiesModel(),
                                                                            new AssociationsModel(),
                                                                            new ManyAssociationsModel(),
@@ -158,7 +159,7 @@ public class ValueTypeFactory
     private static class ValueFinder
         extends HierarchicalVisitorAdapter<Object, Object, RuntimeException>
     {
-        private Class type;
+        private Class<?> type;
         private ValueModel foundModel;
         private Visibility visibility;
 
@@ -199,18 +200,18 @@ public class ValueTypeFactory
             {
                 return true;
             }
-            else if (visited instanceof LayerModel )
+            else if( visited instanceof LayerModel )
             {
                 return true;
             }
-            else if (visited instanceof UsedLayersModel )
+            else if( visited instanceof UsedLayersModel )
             {
                 return true;
             }
             else if( visited instanceof ValueModel )
             {
                 ValueModel valueModel = (ValueModel) visited;
-                boolean typeEquality = Specifications.in( valueModel.types() ).test( type );
+                boolean typeEquality = valueModel.types().anyMatch( t -> t.equals( type ) );
                 if( typeEquality && valueModel.visibility().ordinal() >= visibility.ordinal() )
                 {
                     foundModel = valueModel;

http://git-wip-us.apache.org/repos/asf/zest-java/blob/bd6fbad9/core/runtime/src/main/java/org/apache/zest/runtime/unitofwork/UnitOfWorkInstance.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/zest/runtime/unitofwork/UnitOfWorkInstance.java b/core/runtime/src/main/java/org/apache/zest/runtime/unitofwork/UnitOfWorkInstance.java
index 2136528..f80f544 100644
--- a/core/runtime/src/main/java/org/apache/zest/runtime/unitofwork/UnitOfWorkInstance.java
+++ b/core/runtime/src/main/java/org/apache/zest/runtime/unitofwork/UnitOfWorkInstance.java
@@ -55,7 +55,6 @@ import org.apache.zest.spi.module.ModuleSpi;
 
 import static org.apache.zest.api.unitofwork.UnitOfWorkCallback.UnitOfWorkStatus.COMPLETED;
 import static org.apache.zest.api.unitofwork.UnitOfWorkCallback.UnitOfWorkStatus.DISCARDED;
-import static org.apache.zest.functional.Iterables.map;
 
 public final class UnitOfWorkInstance
 {
@@ -168,9 +167,9 @@ public final class UnitOfWorkInstance
                 {
                     throw new EntityTypeNotFoundException( mixinType.getName(),
                                                            module.name(),
-                                                           map( ModelModule.toStringFunction,
-                                                                module.findVisibleEntityTypes()
-                                                           ) );
+                                                           module.findVisibleEntityTypes()
+                                                               .map( ModelModule.toStringFunction )
+                    );
                 }
             }
 
@@ -237,10 +236,7 @@ public final class UnitOfWorkInstance
                     }
                     if( prunedInstances != null )
                     {
-                        for( EntityReference prunedInstance : prunedInstances )
-                        {
-                            instanceCache.remove( prunedInstance );
-                        }
+                        prunedInstances.forEach( instanceCache::remove );
                     }
                 }
             }
@@ -279,10 +275,7 @@ public final class UnitOfWorkInstance
         notifyBeforeCompletion( currentCallbacks );
 
         // Commit all changes
-        for( StateCommitter committer : committers )
-        {
-            committer.commit();
-        }
+        committers.forEach( StateCommitter::commit );
 
         close();
 
@@ -305,12 +298,7 @@ public final class UnitOfWorkInstance
 
         // Call callbacks
         notifyAfterCompletion( currentCallbacks, DISCARDED );
-
-        for( EntityStoreUnitOfWork entityStoreUnitOfWork : storeUnitOfWork.values() )
-        {
-            entityStoreUnitOfWork.discard();
-        }
-
+        storeUnitOfWork.values().forEach( EntityStoreUnitOfWork::discard );
         callbacks = currentCallbacks;
     }
 
@@ -368,10 +356,7 @@ public final class UnitOfWorkInstance
             catch( Exception e )
             {
                 // Cancel all previously prepared stores
-                for( StateCommitter committer : committers )
-                {
-                    committer.cancel();
-                }
+                committers.forEach( StateCommitter::cancel );
 
                 if( e instanceof ConcurrentEntityStateModificationException )
                 {
@@ -381,14 +366,9 @@ public final class UnitOfWorkInstance
                     Collection<EntityComposite> modifiedEntities = new ArrayList<>();
                     for( EntityReference modifiedEntityIdentity : modifiedEntityIdentities )
                     {
-                        Collection<EntityInstance> instances = instanceCache.values();
-                        for( EntityInstance instance : instances )
-                        {
-                            if( instance.identity().equals( modifiedEntityIdentity ) )
-                            {
-                                modifiedEntities.add( instance.<EntityComposite>proxy() );
-                            }
-                        }
+                        instanceCache.values().stream()
+                            .filter( instance -> instance.identity().equals( modifiedEntityIdentity ) )
+                            .forEach( instance -> modifiedEntities.add( instance.<EntityComposite>proxy() ) );
                     }
                     throw new ConcurrentEntityModificationException( modifiedEntities );
                 }

http://git-wip-us.apache.org/repos/asf/zest-java/blob/bd6fbad9/core/runtime/src/main/java/org/apache/zest/runtime/value/ValueBuilderInstance.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/zest/runtime/value/ValueBuilderInstance.java b/core/runtime/src/main/java/org/apache/zest/runtime/value/ValueBuilderInstance.java
index ceeeb10..9375b50 100644
--- a/core/runtime/src/main/java/org/apache/zest/runtime/value/ValueBuilderInstance.java
+++ b/core/runtime/src/main/java/org/apache/zest/runtime/value/ValueBuilderInstance.java
@@ -19,10 +19,8 @@ import org.apache.zest.api.composite.Composite;
 import org.apache.zest.api.value.NoSuchValueException;
 import org.apache.zest.api.value.ValueBuilder;
 import org.apache.zest.runtime.composite.StateResolver;
-import org.apache.zest.spi.module.ModelModule;
 import org.apache.zest.runtime.structure.ModuleInstance;
-
-import static org.apache.zest.functional.Iterables.first;
+import org.apache.zest.spi.module.ModelModule;
 
 /**
  * Implementation of ValueBuilder
@@ -34,7 +32,10 @@ public final class ValueBuilderInstance<T>
     private final ModuleInstance currentModule;
     private final ValueInstance prototypeInstance;
 
-    public ValueBuilderInstance( ModelModule<ValueModel> compositeModelModule, ModuleInstance currentModule, StateResolver stateResolver )
+    public ValueBuilderInstance( ModelModule<ValueModel> compositeModelModule,
+                                 ModuleInstance currentModule,
+                                 StateResolver stateResolver
+    )
     {
         ValueStateInstance state = new ValueStateInstance( compositeModelModule, currentModule, stateResolver );
         prototypeInstance = compositeModelModule.model().newValueInstance( compositeModelModule.module(), state );
@@ -65,7 +66,7 @@ public final class ValueBuilderInstance<T>
     public T newInstance()
         throws ConstructionException
     {
-        Class<Composite> valueType = (Class<Composite>) first( prototypeInstance.types() );
+        Class<Composite> valueType = (Class<Composite>) prototypeInstance.types().findFirst().orElse( null );
 
         ModelModule<ValueModel> valueModel = currentModule.typeLookup().lookupValueModel( valueType );
 
@@ -75,5 +76,4 @@ public final class ValueBuilderInstance<T>
         }
         return new ValueBuilderWithPrototype<>( valueModel, currentModule, prototype() ).newInstance();
     }
-
 }

http://git-wip-us.apache.org/repos/asf/zest-java/blob/bd6fbad9/core/runtime/src/main/java/org/apache/zest/runtime/value/ValueInstance.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/zest/runtime/value/ValueInstance.java b/core/runtime/src/main/java/org/apache/zest/runtime/value/ValueInstance.java
index 3141ac1..c22890e 100644
--- a/core/runtime/src/main/java/org/apache/zest/runtime/value/ValueInstance.java
+++ b/core/runtime/src/main/java/org/apache/zest/runtime/value/ValueInstance.java
@@ -106,31 +106,27 @@ public final class ValueInstance
      */
     public void prepareToBuild()
     {
-        for( PropertyModel propertyDescriptor : descriptor().state().properties() )
-        {
+        descriptor().state().properties().forEach( propertyDescriptor -> {
             PropertyInstance<Object> propertyInstance =
                 (PropertyInstance<Object>) state.propertyFor( propertyDescriptor.accessor() );
 
             propertyInstance.prepareToBuild( propertyDescriptor );
-        }
+        } );
 
-        for( AssociationModel associationDescriptor : descriptor().state().associations() )
-        {
+        descriptor().state().associations().forEach( associationDescriptor -> {
             state().associationFor( associationDescriptor.accessor() )
                 .setAssociationInfo( associationDescriptor.getBuilderInfo() );
-        }
+        } );
 
-        for( ManyAssociationModel associationDescriptor : descriptor().state().manyAssociations() )
-        {
+        descriptor().state().manyAssociations().forEach( associationDescriptor -> {
             state().manyAssociationFor( associationDescriptor.accessor() )
                 .setAssociationInfo( associationDescriptor.getBuilderInfo() );
-        }
+        } );
 
-        for( NamedAssociationModel associationDescriptor : descriptor().state().namedAssociations() )
-        {
+        descriptor().state().namedAssociations().forEach( associationDescriptor -> {
             state().namedAssociationFor( associationDescriptor.accessor() )
                 .setAssociationInfo( associationDescriptor.getBuilderInfo() );
-        }
+        } );
     }
 
     /**
@@ -139,27 +135,23 @@ public final class ValueInstance
      */
     public void prepareBuilderState()
     {
-        for( PropertyModel propertyDescriptor : descriptor().state().properties() )
-        {
+        descriptor().state().properties().forEach( propertyDescriptor -> {
             PropertyInstance<Object> propertyInstance =
                 (PropertyInstance<Object>) state.propertyFor( propertyDescriptor.accessor() );
             propertyInstance.prepareBuilderState( propertyDescriptor );
-        }
+        } );
 
-        for( AssociationModel associationDescriptor : descriptor().state().associations() )
-        {
+        descriptor().state().associations().forEach( associationDescriptor -> {
             state().associationFor( associationDescriptor.accessor() ).setAssociationInfo( associationDescriptor );
-        }
+        } );
 
-        for( ManyAssociationModel associationDescriptor : descriptor().state().manyAssociations() )
-        {
+        descriptor().state().manyAssociations().forEach( associationDescriptor -> {
             state().manyAssociationFor( associationDescriptor.accessor() ).setAssociationInfo( associationDescriptor );
-        }
+        } );
 
-        for( NamedAssociationModel associationDescriptor : descriptor().state().namedAssociations() )
-        {
+        descriptor().state().namedAssociations().forEach( associationDescriptor -> {
             state().namedAssociationFor( associationDescriptor.accessor() ).setAssociationInfo( associationDescriptor );
-        }
+        } );
     }
 
     /**

http://git-wip-us.apache.org/repos/asf/zest-java/blob/bd6fbad9/core/runtime/src/main/java/org/apache/zest/runtime/value/ValueModel.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/zest/runtime/value/ValueModel.java b/core/runtime/src/main/java/org/apache/zest/runtime/value/ValueModel.java
index aa8c9b4..5b23765 100644
--- a/core/runtime/src/main/java/org/apache/zest/runtime/value/ValueModel.java
+++ b/core/runtime/src/main/java/org/apache/zest/runtime/value/ValueModel.java
@@ -14,33 +14,30 @@
 
 package org.apache.zest.runtime.value;
 
+import java.util.List;
 import org.apache.zest.api.common.MetaInfo;
 import org.apache.zest.api.common.Visibility;
 import org.apache.zest.api.constraint.ConstraintViolationException;
 import org.apache.zest.api.type.ValueCompositeType;
 import org.apache.zest.api.value.ValueDescriptor;
-import org.apache.zest.runtime.association.AssociationModel;
-import org.apache.zest.runtime.association.ManyAssociationModel;
 import org.apache.zest.runtime.composite.CompositeMethodsModel;
 import org.apache.zest.runtime.composite.CompositeModel;
 import org.apache.zest.runtime.composite.MixinModel;
 import org.apache.zest.runtime.composite.MixinsModel;
 import org.apache.zest.runtime.composite.UsesInstance;
 import org.apache.zest.runtime.injection.InjectionContext;
-import org.apache.zest.runtime.property.PropertyModel;
 import org.apache.zest.runtime.unitofwork.UnitOfWorkInstance;
 import org.apache.zest.spi.module.ModuleSpi;
 
 /**
  * Model for ValueComposites
  */
-public final class ValueModel
-    extends CompositeModel
+public final class ValueModel extends CompositeModel
     implements ValueDescriptor
 {
     private ValueCompositeType valueType;
 
-    public ValueModel( final Iterable<Class<?>> types,
+    public ValueModel( final List<Class<?>> types,
                        final Visibility visibility,
                        final MetaInfo metaInfo,
                        final MixinsModel mixinsModel,
@@ -69,25 +66,26 @@ public final class ValueModel
     void checkConstraints( ValueStateInstance state )
         throws ConstraintViolationException
     {
-        for( PropertyModel propertyModel : stateModel.properties() )
-        {
-            propertyModel.checkConstraints( state.propertyFor( propertyModel.accessor() ).get() );
-        }
+        stateModel.properties().forEach( propertyModel ->
+            propertyModel.checkConstraints( state.propertyFor( propertyModel.accessor() ).get() )
+        );
 
         // IF no UnitOfWork is active, then the Association checks shouldn't be done.
         if( UnitOfWorkInstance.getCurrent().empty() )
         {
             return;
         }
-        for( AssociationModel associationModel : ( (ValueStateModel) stateModel ).associations() )
-        {
-            associationModel.checkConstraints( state.associationFor( associationModel.accessor() ).get() );
-        }
+        ( (ValueStateModel) stateModel ).associations().forEach( associationModel ->
+            associationModel.checkConstraints( state.associationFor( associationModel.accessor() ).get() )
+        );
 
-        for( ManyAssociationModel associationModel : ( (ValueStateModel) stateModel ).manyAssociations() )
-        {
-            associationModel.checkAssociationConstraints( state.manyAssociationFor( associationModel.accessor() ) );
-        }
+        ( (ValueStateModel) stateModel ).manyAssociations().forEach( associationModel ->
+            associationModel.checkAssociationConstraints( state.manyAssociationFor( associationModel.accessor() ) )
+        );
+
+        ( (ValueStateModel) stateModel ).namedAssociations().forEach( associationModel ->
+            associationModel.checkAssociationConstraints( state.namedAssociationFor( associationModel.accessor() ) )
+        );
     }
 
     public ValueInstance newValueInstance( ModuleSpi moduleInstance,

http://git-wip-us.apache.org/repos/asf/zest-java/blob/bd6fbad9/core/runtime/src/main/java/org/apache/zest/runtime/value/ValueStateInstance.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/zest/runtime/value/ValueStateInstance.java b/core/runtime/src/main/java/org/apache/zest/runtime/value/ValueStateInstance.java
index 84a2719..ef0c20b 100644
--- a/core/runtime/src/main/java/org/apache/zest/runtime/value/ValueStateInstance.java
+++ b/core/runtime/src/main/java/org/apache/zest/runtime/value/ValueStateInstance.java
@@ -23,23 +23,18 @@ import java.lang.reflect.AccessibleObject;
 import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
-import org.apache.zest.api.association.AssociationDescriptor;
+import java.util.stream.Stream;
 import org.apache.zest.api.association.AssociationStateHolder;
 import org.apache.zest.api.entity.EntityReference;
-import org.apache.zest.api.property.PropertyDescriptor;
 import org.apache.zest.runtime.association.AssociationInfo;
 import org.apache.zest.runtime.association.AssociationInstance;
-import org.apache.zest.runtime.association.AssociationModel;
 import org.apache.zest.runtime.association.ManyAssociationInstance;
-import org.apache.zest.runtime.association.ManyAssociationModel;
 import org.apache.zest.runtime.association.NamedAssociationInstance;
-import org.apache.zest.runtime.association.NamedAssociationModel;
 import org.apache.zest.runtime.composite.StateResolver;
 import org.apache.zest.runtime.property.PropertyInfo;
 import org.apache.zest.runtime.property.PropertyInstance;
-import org.apache.zest.runtime.property.PropertyModel;
-import org.apache.zest.spi.module.ModelModule;
 import org.apache.zest.runtime.structure.ModuleInstance;
+import org.apache.zest.spi.module.ModelModule;
 
 /**
  * TODO
@@ -66,34 +61,33 @@ public final class ValueStateInstance
 
     public ValueStateInstance( ModelModule<ValueModel> compositeModelModule,
                                ModuleInstance currentModule,
-                               StateResolver stateResolver )
+                               StateResolver stateResolver
+    )
     {
         ValueModel valueModel = compositeModelModule.model();
         this.properties = new LinkedHashMap<>();
-        for( PropertyDescriptor propertyDescriptor : valueModel.state().properties() )
-        {
-            PropertyInfo builderInfo = ( (PropertyModel) propertyDescriptor ).getBuilderInfo();
+        valueModel.state().properties().forEach( propertyDescriptor -> {
+            PropertyInfo builderInfo = propertyDescriptor.getBuilderInfo();
             Object value = stateResolver.getPropertyState( propertyDescriptor );
             PropertyInstance<Object> propertyInstance = new PropertyInstance<>( builderInfo, value );
             properties.put( propertyDescriptor.accessor(), propertyInstance );
-        }
+        } );
 
         this.associations = new LinkedHashMap<>();
-        for( AssociationDescriptor associationDescriptor : valueModel.state().associations() )
-        {
-            AssociationInfo builderInfo = ( (AssociationModel) associationDescriptor ).getBuilderInfo();
+        valueModel.state().associations().forEach( associationDescriptor -> {
+            AssociationInfo builderInfo = associationDescriptor.getBuilderInfo();
             EntityReference value = stateResolver.getAssociationState( associationDescriptor );
             AssociationInstance<Object> associationInstance1 = new AssociationInstance<>(
                 builderInfo,
                 currentModule.getEntityFunction(),
                 new ReferenceProperty( value ) );
             associations.put( associationDescriptor.accessor(), associationInstance1 );
-        }
+        } );
 
         this.manyAssociations = new LinkedHashMap<>();
-        for( AssociationDescriptor associationDescriptor : valueModel.state().manyAssociations() )
-        {
-            AssociationInfo builderInfo = ( (ManyAssociationModel) associationDescriptor ).getBuilderInfo();
+        valueModel.state().manyAssociations().forEach( associationDescriptor -> {
+            AssociationInfo builderInfo = associationDescriptor
+                .getBuilderInfo();
             List<EntityReference> value = stateResolver.getManyAssociationState( associationDescriptor );
             ManyAssociationValueState manyAssociationState = new ManyAssociationValueState( value );
             ManyAssociationInstance<Object> associationInstance = new ManyAssociationInstance<>(
@@ -101,12 +95,12 @@ public final class ValueStateInstance
                 currentModule.getEntityFunction(),
                 manyAssociationState );
             manyAssociations.put( associationDescriptor.accessor(), associationInstance );
-        }
+        } );
 
         this.namedAssociations = new LinkedHashMap<>();
-        for( AssociationDescriptor associationDescriptor : valueModel.state().namedAssociations() )
-        {
-            AssociationInfo builderInfo = ( (NamedAssociationModel) associationDescriptor ).getBuilderInfo();
+        valueModel.state().namedAssociations().forEach( associationDescriptor -> {
+            AssociationInfo builderInfo = associationDescriptor
+                .getBuilderInfo();
             Map<String, EntityReference> value = stateResolver.getNamedAssociationState( associationDescriptor );
             NamedAssociationValueState namedAssociationState = new NamedAssociationValueState( value );
             NamedAssociationInstance<Object> associationInstance = new NamedAssociationInstance<>(
@@ -114,7 +108,7 @@ public final class ValueStateInstance
                 currentModule.getEntityFunction(),
                 namedAssociationState );
             namedAssociations.put( associationDescriptor.accessor(), associationInstance );
-        }
+        } );
     }
 
     @Override
@@ -133,9 +127,9 @@ public final class ValueStateInstance
     }
 
     @Override
-    public Iterable<PropertyInstance<?>> properties()
+    public Stream<PropertyInstance<?>> properties()
     {
-        return properties.values();
+        return properties.values().stream();
     }
 
     @Override
@@ -153,9 +147,9 @@ public final class ValueStateInstance
     }
 
     @Override
-    public Iterable<AssociationInstance<?>> allAssociations()
+    public Stream<AssociationInstance<?>> allAssociations()
     {
-        return associations.values();
+        return associations.values().stream();
     }
 
     @Override
@@ -173,9 +167,9 @@ public final class ValueStateInstance
     }
 
     @Override
-    public Iterable<ManyAssociationInstance<?>> allManyAssociations()
+    public Stream<ManyAssociationInstance<?>> allManyAssociations()
     {
-        return manyAssociations.values();
+        return manyAssociations.values().stream();
     }
 
     @Override
@@ -193,11 +187,12 @@ public final class ValueStateInstance
     }
 
     @Override
-    public Iterable<? extends NamedAssociationInstance<?>> allNamedAssociations()
+    public Stream<? extends NamedAssociationInstance<?>> allNamedAssociations()
     {
-        return namedAssociations.values();
+        return namedAssociations.values().stream();
     }
 
+    @SuppressWarnings( "SimplifiableIfStatement" )
     @Override
     public boolean equals( Object obj )
     {

http://git-wip-us.apache.org/repos/asf/zest-java/blob/bd6fbad9/core/runtime/src/main/java/org/apache/zest/runtime/value/ValueStateModel.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/zest/runtime/value/ValueStateModel.java b/core/runtime/src/main/java/org/apache/zest/runtime/value/ValueStateModel.java
index e34398f..636664a 100644
--- a/core/runtime/src/main/java/org/apache/zest/runtime/value/ValueStateModel.java
+++ b/core/runtime/src/main/java/org/apache/zest/runtime/value/ValueStateModel.java
@@ -19,6 +19,7 @@
  */
 package org.apache.zest.runtime.value;
 
+import java.util.stream.Stream;
 import org.apache.zest.api.association.AssociationDescriptor;
 import org.apache.zest.api.association.AssociationStateDescriptor;
 import org.apache.zest.api.common.QualifiedName;
@@ -93,19 +94,19 @@ public final class ValueStateModel
     }
 
     @Override
-    public Iterable<AssociationModel> associations()
+    public Stream<AssociationModel> associations()
     {
         return associationsModel.associations();
     }
 
     @Override
-    public Iterable<ManyAssociationModel> manyAssociations()
+    public Stream<ManyAssociationModel> manyAssociations()
     {
         return manyAssociationsModel.manyAssociations();
     }
 
     @Override
-    public Iterable<NamedAssociationModel> namedAssociations()
+    public Stream<NamedAssociationModel> namedAssociations()
     {
         return namedAssociationsModel.namedAssociations();
     }

http://git-wip-us.apache.org/repos/asf/zest-java/blob/bd6fbad9/core/runtime/src/main/java/org/apache/zest/runtime/value/ValuesModel.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/zest/runtime/value/ValuesModel.java b/core/runtime/src/main/java/org/apache/zest/runtime/value/ValuesModel.java
index 08f91e1..7fcadac 100644
--- a/core/runtime/src/main/java/org/apache/zest/runtime/value/ValuesModel.java
+++ b/core/runtime/src/main/java/org/apache/zest/runtime/value/ValuesModel.java
@@ -15,6 +15,8 @@
 package org.apache.zest.runtime.value;
 
 import java.util.List;
+import java.util.stream.Stream;
+import org.apache.zest.api.value.ValueDescriptor;
 import org.apache.zest.functional.HierarchicalVisitor;
 import org.apache.zest.functional.VisitableHierarchy;
 
@@ -31,9 +33,9 @@ public final class ValuesModel
         this.valueModels = valueModels;
     }
 
-    public Iterable<ValueModel> models()
+    public Stream<ValueModel> models()
     {
-        return valueModels;
+        return valueModels.stream();
     }
 
     @Override
@@ -52,4 +54,9 @@ public final class ValuesModel
         }
         return visitor.visitLeave( this );
     }
+
+    public Stream<? extends ValueDescriptor> stream()
+    {
+        return valueModels.stream();
+    }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/zest-java/blob/bd6fbad9/core/runtime/src/test/java/org/apache/zest/api/common/PluginTest.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/test/java/org/apache/zest/api/common/PluginTest.java b/core/runtime/src/test/java/org/apache/zest/api/common/PluginTest.java
index 9bbe4ec..e92d97f 100644
--- a/core/runtime/src/test/java/org/apache/zest/api/common/PluginTest.java
+++ b/core/runtime/src/test/java/org/apache/zest/api/common/PluginTest.java
@@ -19,8 +19,6 @@ import java.lang.reflect.Method;
 import java.lang.reflect.Proxy;
 import java.util.Collections;
 import java.util.List;
-import org.junit.Ignore;
-import org.junit.Test;
 import org.apache.zest.api.injection.scope.Service;
 import org.apache.zest.api.injection.scope.Structure;
 import org.apache.zest.api.mixin.Mixins;
@@ -42,10 +40,8 @@ import org.apache.zest.bootstrap.LayerAssembly;
 import org.apache.zest.bootstrap.LayerName;
 import org.apache.zest.bootstrap.ModuleAssembly;
 import org.apache.zest.bootstrap.ModuleName;
-import org.apache.zest.functional.Iterables;
-
-import static org.apache.zest.functional.Iterables.first;
-import static org.apache.zest.functional.Iterables.toArray;
+import org.junit.Ignore;
+import org.junit.Test;
 
 /**
  * Sample of how a plugin architecture could work.
@@ -73,19 +69,19 @@ public class PluginTest
             throws AssemblyException
         {
             return applicationFactory.newApplicationAssembly( new Assembler[][][]
-                                                              {
                                                                   {
                                                                       {
-                                                                          new PluginAssembler(),
-                                                                          new UIAssembler(),
-                                                                      }
-                                                                  },
-                                                                  {
+                                                                          {
+                                                                              new PluginAssembler(),
+                                                                              new UIAssembler(),
+                                                                          }
+                                                                      },
                                                                       {
-                                                                          new ServiceAssembler()
+                                                                          {
+                                                                              new ServiceAssembler()
+                                                                          }
                                                                       }
-                                                                  }
-                                                              } );
+                                                                  } );
         }
     }
 
@@ -294,26 +290,21 @@ public class PluginTest
         public Object importService( final ImportedServiceDescriptor serviceDescriptor )
             throws ServiceImporterException
         {
-            final Class<?> mainType = first( serviceDescriptor.types() );
-            
-            Class[] interfaces = toArray( Class.class, Iterables.<Class>cast( serviceDescriptor.types() ) );
+            final Class<?> mainType = serviceDescriptor.types().findFirst().orElse(null);
+
+            Class[] interfaces = serviceDescriptor.types().toArray( Class[]::new );
             return Proxy.newProxyInstance(
                 mainType.getClassLoader(),
                 interfaces,
-                new InvocationHandler()
-                {
-                    public Object invoke( Object proxy, Method method, Object[] args )
-                        throws Throwable
+                ( proxy, method, args ) -> {
+                    ServiceFinder finder = serviceDescriptor.metaInfo( ServiceFinder.class );
+                    if( finder == null )
                     {
-                        ServiceFinder finder = serviceDescriptor.metaInfo( ServiceFinder.class );
-                        if( finder == null )
-                        {
-                            throw new ServiceImporterException( "No ServiceFinder specified for imported service " + serviceDescriptor
-                                .identity() );
-                        }
-                        Object service = finder.findService( mainType ).get();
-                        return method.invoke( service, args );
+                        throw new ServiceImporterException( "No ServiceFinder specified for imported service " + serviceDescriptor
+                            .identity() );
                     }
+                    Object service = finder.findService( mainType ).get();
+                    return method.invoke( service, args );
                 } );
         }
 

http://git-wip-us.apache.org/repos/asf/zest-java/blob/bd6fbad9/core/runtime/src/test/java/org/apache/zest/bootstrap/ApplicationAssemblerTest.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/test/java/org/apache/zest/bootstrap/ApplicationAssemblerTest.java b/core/runtime/src/test/java/org/apache/zest/bootstrap/ApplicationAssemblerTest.java
index 4252415..aafc3cc 100644
--- a/core/runtime/src/test/java/org/apache/zest/bootstrap/ApplicationAssemblerTest.java
+++ b/core/runtime/src/test/java/org/apache/zest/bootstrap/ApplicationAssemblerTest.java
@@ -27,7 +27,6 @@ import org.apache.zest.api.service.ServiceComposite;
 import org.apache.zest.api.service.ServiceDescriptor;
 import org.apache.zest.api.structure.ApplicationDescriptor;
 import org.apache.zest.functional.HierarchicalVisitorAdapter;
-import org.apache.zest.functional.Specifications;
 
 /**
  * TODO
@@ -56,11 +55,11 @@ public class ApplicationAssemblerTest
 
                 module.entities( TestEntity.class );
 
-                layer1.services( AssemblySpecifications.types( TestService.class ) ).instantiateOnStartup();
+                layer1.services( AssemblySpecifications.ofAnyType( TestService.class ) ).instantiateOnStartup();
 
-                layer1.services( Specifications.<Object>TRUE() ).visibleIn( Visibility.layer );
+                layer1.services( s -> true ).visibleIn( Visibility.layer );
 
-                layer1.entities( Specifications.<Object>TRUE() ).visibleIn( Visibility.application );
+                layer1.entities( s -> true ).visibleIn( Visibility.application );
 
                 return assembly;
             }

http://git-wip-us.apache.org/repos/asf/zest-java/blob/bd6fbad9/core/runtime/src/test/java/org/apache/zest/runtime/ZestSPITest.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/test/java/org/apache/zest/runtime/ZestSPITest.java b/core/runtime/src/test/java/org/apache/zest/runtime/ZestSPITest.java
index 9c4e205..d171396 100644
--- a/core/runtime/src/test/java/org/apache/zest/runtime/ZestSPITest.java
+++ b/core/runtime/src/test/java/org/apache/zest/runtime/ZestSPITest.java
@@ -87,18 +87,16 @@ public class ZestSPITest
 
     private void validateState( AssociationStateHolder state, EntityDescriptor entityDescriptor )
     {
-        for( PropertyDescriptor propertyDescriptor : entityDescriptor.state().properties() )
-        {
+        entityDescriptor.state().properties().forEach( propertyDescriptor -> {
             Property<?> prop = state.propertyFor( propertyDescriptor.accessor() );
             assertThat( "Properties could be listed", prop, CoreMatchers.notNullValue() );
-        }
+        } );
 
         AssociationStateDescriptor descriptor = entityDescriptor.state();
-        for( AssociationDescriptor associationDescriptor : descriptor.associations() )
-        {
+        descriptor.associations().forEach( associationDescriptor -> {
             AbstractAssociation assoc = state.associationFor( associationDescriptor.accessor() );
             assertThat( "Assocs could be listed", assoc, CoreMatchers.notNullValue() );
-        }
+        } );
     }
 
     public interface TestEntity

http://git-wip-us.apache.org/repos/asf/zest-java/blob/bd6fbad9/core/runtime/src/test/java/org/apache/zest/runtime/structure/CompositeDescriptorTest.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/test/java/org/apache/zest/runtime/structure/CompositeDescriptorTest.java b/core/runtime/src/test/java/org/apache/zest/runtime/structure/CompositeDescriptorTest.java
index 58a42d4..4cc78cc 100644
--- a/core/runtime/src/test/java/org/apache/zest/runtime/structure/CompositeDescriptorTest.java
+++ b/core/runtime/src/test/java/org/apache/zest/runtime/structure/CompositeDescriptorTest.java
@@ -40,7 +40,7 @@ public class CompositeDescriptorTest
         TransientDescriptor addressDescriptor = spi.transientDescriptorFor( address );
 
         assertNotNull( addressDescriptor );
-        assertEquals( AddressComposite.class, first( addressDescriptor.types() ) );
+        assertEquals( AddressComposite.class, addressDescriptor.types().findFirst().orElse( null ) );
         assertTrue( TransientDescriptor.class.isAssignableFrom( addressDescriptor.getClass() ) );
     }
 
@@ -51,7 +51,7 @@ public class CompositeDescriptorTest
         TransientDescriptor addressDesc = module.transientDescriptor( AddressComposite.class.getName() );
         assertNotNull( addressDesc );
 
-        assertEquals( AddressComposite.class, first( addressDesc.types() ) );
+        assertEquals( AddressComposite.class, addressDesc.types().findFirst().orElse( null ) );
     }
 
     public final void assemble( ModuleAssembly aModule )

http://git-wip-us.apache.org/repos/asf/zest-java/blob/bd6fbad9/core/spi/src/main/java/org/apache/zest/spi/entity/QualifiedIdentity.java
----------------------------------------------------------------------
diff --git a/core/spi/src/main/java/org/apache/zest/spi/entity/QualifiedIdentity.java b/core/spi/src/main/java/org/apache/zest/spi/entity/QualifiedIdentity.java
index 04088a2..f604e98 100644
--- a/core/spi/src/main/java/org/apache/zest/spi/entity/QualifiedIdentity.java
+++ b/core/spi/src/main/java/org/apache/zest/spi/entity/QualifiedIdentity.java
@@ -61,9 +61,9 @@ public final class QualifiedIdentity
 
     public QualifiedIdentity( EntityComposite entityComposite )
     {
-        this( entityComposite.identity().get(), first( ZestAPI.FUNCTION_DESCRIPTOR_FOR
+        this( entityComposite.identity().get(), ZestAPI.FUNCTION_DESCRIPTOR_FOR
                                                            .apply( entityComposite )
-                                                           .types() ).getName() );
+                                                           .types().findFirst().get().getName() );
     }
 
     public QualifiedIdentity( String identity, Class<?> clazz )

http://git-wip-us.apache.org/repos/asf/zest-java/blob/bd6fbad9/core/spi/src/main/java/org/apache/zest/spi/entitystore/helpers/JSONMapEntityStoreMixin.java
----------------------------------------------------------------------
diff --git a/core/spi/src/main/java/org/apache/zest/spi/entitystore/helpers/JSONMapEntityStoreMixin.java b/core/spi/src/main/java/org/apache/zest/spi/entitystore/helpers/JSONMapEntityStoreMixin.java
index 8c9bf68..72f7a99 100644
--- a/core/spi/src/main/java/org/apache/zest/spi/entitystore/helpers/JSONMapEntityStoreMixin.java
+++ b/core/spi/src/main/java/org/apache/zest/spi/entitystore/helpers/JSONMapEntityStoreMixin.java
@@ -164,7 +164,7 @@ public class JSONMapEntityStoreMixin
             JSONObject state = new JSONObject();
             state.put( JSONKeys.IDENTITY, identity.identity() );
             state.put( JSONKeys.APPLICATION_VERSION, application.version() );
-            state.put( JSONKeys.TYPE, first( entityDescriptor.types() ).getName() );
+            state.put( JSONKeys.TYPE, entityDescriptor.types().findFirst().get().getName() );
             state.put( JSONKeys.VERSION, unitOfWork.identity() );
             state.put( JSONKeys.MODIFIED, unitOfWork.currentTime() );
             state.put( JSONKeys.PROPERTIES, new JSONObject() );
@@ -435,9 +435,9 @@ public class JSONMapEntityStoreMixin
             {
                 throw new EntityTypeNotFoundException( type,
                                                        module.name(),
-                                                       map( ModelModule.toStringFunction,
-                                                            module.findVisibleEntityTypes()
-                                                       ) );
+                                                       module.findVisibleEntityTypes()
+                                                           .map( ModelModule.toStringFunction )
+            );
             }
 
             return new JSONEntityState( valueSerialization,