ZEST-118; Massive update of removing the Iterable<> use for type manipulation 
in the runtime internals and all public APIs of that.


Project: http://git-wip-us.apache.org/repos/asf/zest-java/repo
Commit: http://git-wip-us.apache.org/repos/asf/zest-java/commit/bd6fbad9
Tree: http://git-wip-us.apache.org/repos/asf/zest-java/tree/bd6fbad9
Diff: http://git-wip-us.apache.org/repos/asf/zest-java/diff/bd6fbad9

Branch: refs/heads/develop
Commit: bd6fbad9f3bb053015a6e0e1458a38179dab8ede
Parents: b659ba6
Author: Niclas Hedhman <[email protected]>
Authored: Wed Aug 26 23:44:24 2015 +0800
Committer: Niclas Hedhman <[email protected]>
Committed: Wed Aug 26 23:44:27 2015 +0800

----------------------------------------------------------------------
 .../main/java/org/apache/zest/api/ZestAPI.java  |  76 +-
 .../association/AssociationStateDescriptor.java |   7 +-
 .../api/association/AssociationStateHolder.java |   7 +-
 .../org/apache/zest/api/common/MetaInfo.java    |  15 +-
 .../zest/api/composite/CompositeContext.java    |   8 +-
 .../zest/api/composite/CompositeDescriptor.java |   4 +-
 .../zest/api/composite/StateDescriptor.java     |   3 +-
 .../zest/api/configuration/Configuration.java   |   4 +-
 .../NoSuchConfigurationException.java           |   2 +-
 .../ConstraintViolationException.java           |  34 +-
 .../apache/zest/api/property/StateHolder.java   |   3 +-
 .../zest/api/query/grammar/AndPredicate.java    |   9 +-
 .../zest/api/query/grammar/Notpredicate.java    |   3 +-
 .../zest/api/query/grammar/OrPredicate.java     |   8 +-
 .../api/service/importer/InstanceImporter.java  |  48 +-
 .../api/service/importer/NewObjectImporter.java |   2 +-
 .../importer/ServiceSelectorImporter.java       |   2 +-
 .../apache/zest/api/structure/Application.java  |   3 +
 .../org/apache/zest/api/structure/Layer.java    |   3 +
 .../org/apache/zest/api/structure/Module.java   |  12 +
 .../java/org/apache/zest/api/type/HasTypes.java |   4 +-
 .../zest/api/type/MatchTypeSpecification.java   |  17 +-
 .../zest/api/type/ValueCompositeType.java       |  12 +-
 .../org/apache/zest/api/type/ValueType.java     |  26 +-
 .../unitofwork/EntityTypeNotFoundException.java |  29 +-
 .../api/unitofwork/NoSuchEntityException.java   |  39 +-
 .../org/apache/zest/api/util/Annotations.java   |  55 +-
 .../java/org/apache/zest/api/util/Classes.java  | 474 +++++-------
 .../org/apache/zest/api/util/Constructors.java  |  12 +-
 .../java/org/apache/zest/api/util/Fields.java   |  25 +-
 .../java/org/apache/zest/api/util/Methods.java  |  28 +-
 .../org/apache/zest/api/util/ClassesTest.java   |  48 +-
 .../zest/bootstrap/AssemblySpecifications.java  |  21 +-
 .../bootstrap/builder/ModuleDeclaration.java    |   3 +-
 .../zest/bootstrap/DocumentationSupport.java    |   2 +-
 .../org/apache/zest/functional/ForEach.java     |  97 ---
 .../org/apache/zest/functional/Functions.java   | 237 ------
 .../org/apache/zest/functional/Iterables.java   | 107 +--
 .../apache/zest/functional/Specifications.java  | 208 ------
 .../apache/zest/functional/FunctionsTest.java   | 144 ----
 .../apache/zest/functional/IterablesTest.java   |  90 ---
 .../zest/functional/SpecificationsTest.java     |  86 ---
 .../functional/docsupport/FunctionalDocs.java   |  12 +-
 .../runtime/activation/ActivationDelegate.java  |  14 +-
 .../runtime/association/AssociationModel.java   |  12 +-
 .../runtime/association/AssociationsModel.java  |   5 +-
 .../association/ManyAssociationModel.java       |   7 +-
 .../association/ManyAssociationsModel.java      |   5 +-
 .../association/NamedAssociationModel.java      |   7 +-
 .../association/NamedAssociationsModel.java     |   5 +-
 .../bootstrap/CompositeAssemblyImpl.java        | 436 +++++------
 .../bootstrap/ConfigurationAssemblyImpl.java    |   3 +-
 .../runtime/bootstrap/EntityAssemblyImpl.java   |  56 +-
 .../bootstrap/ImportedServiceAssemblyImpl.java  |   8 +-
 .../runtime/bootstrap/ModuleAssemblyImpl.java   |  46 +-
 .../runtime/bootstrap/ObjectAssemblyImpl.java   |   6 +-
 .../runtime/bootstrap/ServiceAssemblyImpl.java  |  49 +-
 .../runtime/bootstrap/ValueAssemblyImpl.java    |  47 +-
 .../composite/AbstractModifierModel.java        |  21 +-
 .../runtime/composite/CompositeMethodModel.java |  16 +-
 .../composite/CompositeMethodsModel.java        |  31 +-
 .../zest/runtime/composite/CompositeModel.java  |  50 +-
 .../zest/runtime/composite/ConcernsModel.java   |   6 +-
 .../runtime/composite/ConstraintsInstance.java  |   9 +-
 .../runtime/composite/ConstructorModel.java     |   3 +-
 .../runtime/composite/ConstructorsModel.java    |  29 +-
 .../runtime/composite/FragmentClassLoader.java  | 135 ++--
 .../composite/FunctionStateResolver.java        |  20 +-
 .../zest/runtime/composite/MixinModel.java      |  37 +-
 .../zest/runtime/composite/MixinsModel.java     |  65 +-
 .../runtime/composite/SideEffectsModel.java     |   6 +-
 .../zest/runtime/composite/StateModel.java      |   3 +-
 .../composite/TransientBuilderInstance.java     |   6 +-
 .../runtime/composite/TransientClassLoader.java |  58 +-
 .../runtime/composite/TransientInstance.java    |   5 +-
 .../zest/runtime/composite/TransientModel.java  |  14 +-
 .../composite/TransientStateInstance.java       |   5 +-
 .../zest/runtime/composite/TransientsModel.java |  11 +-
 .../zest/runtime/entity/EntitiesModel.java      |  11 +-
 .../zest/runtime/entity/EntityInstance.java     |  81 +--
 .../apache/zest/runtime/entity/EntityModel.java |  45 +-
 .../runtime/entity/EntityStateInstance.java     |  91 +--
 .../zest/runtime/entity/EntityStateModel.java   |   7 +-
 .../zest/runtime/injection/Dependencies.java    |  12 +-
 .../runtime/injection/InjectedFieldModel.java   |  20 +-
 .../runtime/injection/InjectedFieldsModel.java  |  47 +-
 .../runtime/injection/InjectedMethodModel.java  |   3 +-
 .../runtime/injection/InjectedMethodsModel.java |  82 ++-
 .../injection/InjectedParametersModel.java      |   6 +-
 .../InjectionProviderFactoryStrategy.java       |   8 +-
 .../ServiceInjectionProviderFactory.java        |   2 +-
 .../provider/ThisInjectionProviderFactory.java  |  46 +-
 .../zest/runtime/legacy/Specifications.java     |  31 +
 .../apache/zest/runtime/object/ObjectModel.java |   8 +-
 .../zest/runtime/object/ObjectsModel.java       |   5 +-
 .../zest/runtime/property/PropertiesModel.java  |   5 +-
 .../zest/runtime/property/PropertyModel.java    |  17 +-
 .../zest/runtime/query/IterableQuerySource.java |   3 +-
 .../runtime/service/ImportedServiceModel.java   |  12 +-
 .../ImportedServiceReferenceInstance.java       |   3 +-
 .../service/ImportedServicesInstance.java       |  35 +-
 .../runtime/service/ImportedServicesModel.java  |   9 +-
 .../zest/runtime/service/ServiceModel.java      |  80 +-
 .../service/ServiceReferenceInstance.java       |  35 +-
 .../zest/runtime/service/ServicesInstance.java  |  32 +-
 .../zest/runtime/service/ServicesModel.java     |  12 +-
 .../runtime/structure/ApplicationInstance.java  |   7 +
 .../zest/runtime/structure/LayerInstance.java   |  73 +-
 .../zest/runtime/structure/ModuleInstance.java  | 292 +++++---
 .../runtime/structure/ModuleUnitOfWork.java     |  23 +-
 .../zest/runtime/structure/TypeLookup.java      | 321 ++++----
 .../runtime/structure/UsedLayersInstance.java   |  65 +-
 .../zest/runtime/types/ValueTypeFactory.java    |  17 +-
 .../runtime/unitofwork/UnitOfWorkInstance.java  |  40 +-
 .../runtime/value/ValueBuilderInstance.java     |  12 +-
 .../zest/runtime/value/ValueInstance.java       |  40 +-
 .../apache/zest/runtime/value/ValueModel.java   |  34 +-
 .../zest/runtime/value/ValueStateInstance.java  |  59 +-
 .../zest/runtime/value/ValueStateModel.java     |   7 +-
 .../apache/zest/runtime/value/ValuesModel.java  |  11 +-
 .../org/apache/zest/api/common/PluginTest.java  |  51 +-
 .../bootstrap/ApplicationAssemblerTest.java     |   7 +-
 .../org/apache/zest/runtime/ZestSPITest.java    |  10 +-
 .../structure/CompositeDescriptorTest.java      |   4 +-
 .../zest/spi/entity/QualifiedIdentity.java      |   4 +-
 .../helpers/JSONMapEntityStoreMixin.java        |   8 +-
 .../helpers/MapEntityStoreMixin.java            | 215 +++---
 .../org/apache/zest/spi/module/ModelModule.java |  32 +-
 .../org/apache/zest/spi/module/ModuleSpi.java   |  13 +-
 .../spi/value/ValueDeserializerAdapter.java     | 726 ++++++++-----------
 .../zest/spi/value/ValueSerializerAdapter.java  | 227 +++---
 .../prefs/PreferencesEntityStoreMixin.java      | 366 ++++------
 .../entitystore/sql/SQLEntityStoreMixin.java    | 148 ++--
 .../elasticsearch/ElasticSearchIndexer.java     |  77 +-
 .../index/rdf/indexing/RdfIndexingService.java  |  43 +-
 .../solr/internal/SolrEntityIndexerMixin.java   |  19 +-
 .../support/skeletons/AbstractSQLIndexing.java  | 330 ++++-----
 .../support/skeletons/AbstractSQLQuerying.java  | 667 +++++++++--------
 .../support/skeletons/AbstractSQLStartup.java   | 592 +++++++--------
 .../skeletons/SQLCompatEntityStateWrapper.java  |  25 +-
 .../library/circuitbreaker/CircuitBreaker.java  |   5 +-
 .../conversion/values/ValueToEntityMixin.java   | 564 ++++++--------
 .../source/helper/ApplicationEvents.java        | 104 +--
 .../factory/DomainEventFactoryService.java      |  46 +-
 .../domain/source/helper/Events.java            | 161 ++--
 .../library/jmx/ApplicationManagerService.java  |  10 +-
 .../jmx/ConfigurationManagerService.java        |  50 +-
 .../zest/library/scala/ScalaTraitMixin.java     | 130 ++--
 .../debug/service/DebugOnConsoleSideEffect.java |   4 +-
 .../debug/service/DebuggingServiceMixin.java    |   4 +-
 .../library/logging/log/SimpleLogConcern.java   |  11 +-
 .../log/service/LogOnConsoleSideEffect.java     |   4 +-
 .../log/service/LoggingServiceMixin.java        |   3 +-
 .../trace/service/TraceServiceMixin.java        |  56 +-
 .../zest/library/logging/DebuggingTest.java     |   3 +-
 .../zest/library/osgi/OSGiEnabledService.java   |  29 +-
 .../zest/library/osgi/OSGiServiceExporter.java  |  15 +-
 .../rdf/entity/EntityStateSerializer.java       | 107 ++-
 .../rdf/entity/EntityTypeSerializer.java        |  53 +-
 .../library/rdf/model/ApplicationVisitor.java   |   8 +-
 .../zest/library/rdf/model/Model2XML.java       |   4 +-
 .../library/rest/client/api/ErrorHandler.java   |   3 +-
 .../ValueCompositeRequestWriter.java            |  28 +-
 .../rest/server/RestServerException.java        |  34 +
 .../rest/server/api/ContextResource.java        |   7 +-
 .../server/assembler/RestServerAssembler.java   |   6 +-
 .../freemarker/ValueCompositeTemplateModel.java |  31 +-
 .../responsewriter/RestResponseException.java   |  31 +
 .../ValueDescriptorResponseWriter.java          |  19 +-
 .../zest/library/rest/admin/EntityResource.java | 176 +++--
 .../apache/zest/library/restlet/RestForm.java   |   7 +-
 .../repository/SmallCrudRepositoryMixin.java    |   3 +-
 .../restlet/resource/ResourceBuilder.java       |   2 +-
 .../internal/service/ServiceFactoryBean.java    |   2 +-
 .../internal/service/ServiceLocator.java        |   2 +-
 .../library/sql/datasource/DataSources.java     |   3 +-
 .../DataSourceConfigurationManagerService.java  |  29 +-
 .../sample/forum/assembler/ForumAssembler.java  |   3 +-
 .../org/apache/zest/sample/rental/web/Page.java |   5 +-
 .../zest/sample/rental/web/QuikitServlet.java   |   4 +-
 .../zest/envisage/detail/GeneralPane.java       |  59 +-
 .../apache/zest/envisage/detail/MethodPane.java |   2 +-
 .../detail/ServiceConfigurationPane.java        |   9 +-
 .../apache/zest/envisage/detail/StatePane.java  |   2 +-
 .../ImportedServiceCompositeDescriptor.java     |   9 +-
 .../zest/tools/model/util/MethodFinder.java     |   8 +-
 .../model/util/ServiceConfigurationFinder.java  |   2 +-
 .../tools/model/util/ServiceUsageFinder.java    |  13 +-
 .../zest/tools/model/util/StateFinder.java      |   2 +-
 189 files changed, 4451 insertions(+), 5999 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/zest-java/blob/bd6fbad9/core/api/src/main/java/org/apache/zest/api/ZestAPI.java
----------------------------------------------------------------------
diff --git a/core/api/src/main/java/org/apache/zest/api/ZestAPI.java 
b/core/api/src/main/java/org/apache/zest/api/ZestAPI.java
index 6a1422e..22eda4c 100644
--- a/core/api/src/main/java/org/apache/zest/api/ZestAPI.java
+++ b/core/api/src/main/java/org/apache/zest/api/ZestAPI.java
@@ -136,57 +136,47 @@ public interface ZestAPI
     /**
      * Function that returns the CompositeDescriptor of a Composite.
      */
-    Function<Composite, CompositeDescriptor> FUNCTION_DESCRIPTOR_FOR = new 
Function<Composite, CompositeDescriptor>()
-    {
-        @Override
-        public CompositeDescriptor apply( Composite composite )
+    Function<Composite, CompositeDescriptor> FUNCTION_DESCRIPTOR_FOR = 
composite -> {
+        if( composite instanceof Proxy )
         {
-            if( composite instanceof Proxy )
-            {
-                InvocationHandler invocationHandler = 
Proxy.getInvocationHandler( composite );
-                return ( (CompositeInstance) invocationHandler ).descriptor();
-            }
-            try
-            {
-                Class<? extends Composite> compositeClass = 
composite.getClass();
-                Field instanceField = compositeClass.getField( "_instance" );
-                Object instance = instanceField.get( composite );
-                return ( (CompositeInstance) instance ).descriptor();
-            }
-            catch( Exception e )
-            {
-                InvalidCompositeException exception = new 
InvalidCompositeException( "Could not get _instance field" );
-                exception.initCause( e );
-                throw exception;
-            }
+            InvocationHandler invocationHandler = Proxy.getInvocationHandler( 
composite );
+            return ( (CompositeInstance) invocationHandler ).descriptor();
+        }
+        try
+        {
+            Class<? extends Composite> compositeClass = composite.getClass();
+            Field instanceField = compositeClass.getField( "_instance" );
+            Object instance = instanceField.get( composite );
+            return ( (CompositeInstance) instance ).descriptor();
+        }
+        catch( Exception e )
+        {
+            InvalidCompositeException exception = new 
InvalidCompositeException( "Could not get _instance field" );
+            exception.initCause( e );
+            throw exception;
         }
     };
 
     /**
      * Function that returns the CompositeInstance of a Composite.
      */
-    Function<Composite, CompositeInstance> FUNCTION_COMPOSITE_INSTANCE_OF = 
new Function<Composite, CompositeInstance>()
-    {
-        @Override
-        public CompositeInstance apply( Composite composite )
+    Function<Composite, CompositeInstance> FUNCTION_COMPOSITE_INSTANCE_OF = 
composite -> {
+        if( composite instanceof Proxy )
+        {
+            return ( (CompositeInstance) Proxy.getInvocationHandler( composite 
) );
+        }
+        try
+        {
+            Class<? extends Composite> compositeClass = composite.getClass();
+            Field instanceField = compositeClass.getField( "_instance" );
+            Object instance = instanceField.get( composite );
+            return (CompositeInstance) instance;
+        }
+        catch( Exception e )
         {
-            if( composite instanceof Proxy )
-            {
-                return ( (CompositeInstance) Proxy.getInvocationHandler( 
composite ) );
-            }
-            try
-            {
-                Class<? extends Composite> compositeClass = 
composite.getClass();
-                Field instanceField = compositeClass.getField( "_instance" );
-                Object instance = instanceField.get( composite );
-                return (CompositeInstance) instance;
-            }
-            catch( Exception e )
-            {
-                InvalidCompositeException exception = new 
InvalidCompositeException( "Could not get _instance field" );
-                exception.initCause( e );
-                throw exception;
-            }
+            InvalidCompositeException exception = new 
InvalidCompositeException( "Could not get _instance field" );
+            exception.initCause( e );
+            throw exception;
         }
     };
 }

http://git-wip-us.apache.org/repos/asf/zest-java/blob/bd6fbad9/core/api/src/main/java/org/apache/zest/api/association/AssociationStateDescriptor.java
----------------------------------------------------------------------
diff --git 
a/core/api/src/main/java/org/apache/zest/api/association/AssociationStateDescriptor.java
 
b/core/api/src/main/java/org/apache/zest/api/association/AssociationStateDescriptor.java
index a6609da..ca9ffe7 100644
--- 
a/core/api/src/main/java/org/apache/zest/api/association/AssociationStateDescriptor.java
+++ 
b/core/api/src/main/java/org/apache/zest/api/association/AssociationStateDescriptor.java
@@ -19,6 +19,7 @@
  */
 package org.apache.zest.api.association;
 
+import java.util.stream.Stream;
 import org.apache.zest.api.common.QualifiedName;
 import org.apache.zest.api.composite.StateDescriptor;
 
@@ -45,9 +46,9 @@ public interface AssociationStateDescriptor extends 
StateDescriptor
     AssociationDescriptor getNamedAssociationByQualifiedName( QualifiedName 
name )
         throws IllegalArgumentException;
 
-    Iterable<? extends AssociationDescriptor> associations();
+    Stream<? extends AssociationDescriptor> associations();
 
-    Iterable<? extends AssociationDescriptor> manyAssociations();
+    Stream<? extends AssociationDescriptor> manyAssociations();
 
-    Iterable<? extends AssociationDescriptor> namedAssociations();
+    Stream<? extends AssociationDescriptor> namedAssociations();
 }

http://git-wip-us.apache.org/repos/asf/zest-java/blob/bd6fbad9/core/api/src/main/java/org/apache/zest/api/association/AssociationStateHolder.java
----------------------------------------------------------------------
diff --git 
a/core/api/src/main/java/org/apache/zest/api/association/AssociationStateHolder.java
 
b/core/api/src/main/java/org/apache/zest/api/association/AssociationStateHolder.java
index 2a9c035..b13ebe5 100644
--- 
a/core/api/src/main/java/org/apache/zest/api/association/AssociationStateHolder.java
+++ 
b/core/api/src/main/java/org/apache/zest/api/association/AssociationStateHolder.java
@@ -19,6 +19,7 @@
 package org.apache.zest.api.association;
 
 import java.lang.reflect.AccessibleObject;
+import java.util.stream.Stream;
 import org.apache.zest.api.property.StateHolder;
 
 /**
@@ -41,7 +42,7 @@ public interface AssociationStateHolder
      *
      * @return iterable of associations
      */
-    Iterable<? extends Association<?>> allAssociations();
+    Stream<? extends Association<?>> allAssociations();
 
     /**
      * Get a many-association for a specific accessor method
@@ -57,7 +58,7 @@ public interface AssociationStateHolder
      *
      * @return iterable of many-associations
      */
-    Iterable<? extends ManyAssociation<?>> allManyAssociations();
+    Stream<? extends ManyAssociation<?>> allManyAssociations();
 
     /**
      * Get a named-association for a specific accessor method
@@ -73,5 +74,5 @@ public interface AssociationStateHolder
      *
      * @return iterable of named-associations
      */
-    Iterable<? extends NamedAssociation<?>> allNamedAssociations();
+    Stream<? extends NamedAssociation<?>> allNamedAssociations();
 }

http://git-wip-us.apache.org/repos/asf/zest-java/blob/bd6fbad9/core/api/src/main/java/org/apache/zest/api/common/MetaInfo.java
----------------------------------------------------------------------
diff --git a/core/api/src/main/java/org/apache/zest/api/common/MetaInfo.java 
b/core/api/src/main/java/org/apache/zest/api/common/MetaInfo.java
index ac58192..9c7bd60 100644
--- a/core/api/src/main/java/org/apache/zest/api/common/MetaInfo.java
+++ b/core/api/src/main/java/org/apache/zest/api/common/MetaInfo.java
@@ -16,7 +16,6 @@ package org.apache.zest.api.common;
 
 import java.lang.annotation.Annotation;
 import java.lang.reflect.AnnotatedElement;
-import java.lang.reflect.Type;
 import java.util.Collection;
 import java.util.HashSet;
 import java.util.LinkedHashMap;
@@ -80,7 +79,7 @@ public final class MetaInfo
 
     static
     {
-        ignored = new HashSet<Class>( 4, 0.8f ); // Optimize size used.
+        ignored = new HashSet<>( 4, 0.8f ); // Optimize size used.
         ignored.addAll( asList( Mixins.class, Concerns.class, 
SideEffects.class ) );
     }
 
@@ -88,12 +87,12 @@ public final class MetaInfo
 
     public MetaInfo()
     {
-        metaInfoMap = new LinkedHashMap<Class<?>, Object>();
+        metaInfoMap = new LinkedHashMap<>();
     }
 
     public MetaInfo( MetaInfo metaInfo )
     {
-        metaInfoMap = new LinkedHashMap<Class<?>, Object>();
+        metaInfoMap = new LinkedHashMap<>();
         metaInfoMap.putAll( metaInfo.metaInfoMap );
     }
 
@@ -107,11 +106,9 @@ public final class MetaInfo
         else
         {
             Class<?> metaInfoclass = metaInfo.getClass();
-            Iterable<Type> types = typesOf( metaInfoclass );
-            for( Type type : types )
-            {
-                metaInfoMap.put( Classes.RAW_CLASS.apply( type ), metaInfo );
-            }
+            typesOf( metaInfoclass )
+                .map( Classes.RAW_CLASS )
+                .forEach( type -> metaInfoMap.put( type, metaInfo ) );
         }
     }
 

http://git-wip-us.apache.org/repos/asf/zest-java/blob/bd6fbad9/core/api/src/main/java/org/apache/zest/api/composite/CompositeContext.java
----------------------------------------------------------------------
diff --git 
a/core/api/src/main/java/org/apache/zest/api/composite/CompositeContext.java 
b/core/api/src/main/java/org/apache/zest/api/composite/CompositeContext.java
index db1421d..e0fffd2 100644
--- a/core/api/src/main/java/org/apache/zest/api/composite/CompositeContext.java
+++ b/core/api/src/main/java/org/apache/zest/api/composite/CompositeContext.java
@@ -18,11 +18,9 @@ import java.lang.reflect.InvocationHandler;
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
 import java.lang.reflect.Proxy;
+import java.util.stream.Stream;
 import org.apache.zest.api.ZestAPI;
 import org.apache.zest.api.structure.Module;
-import org.apache.zest.functional.Iterables;
-
-import static org.apache.zest.functional.Iterables.toArray;
 
 /**
  * Thread-associated composites. This is basically a ThreadLocal which 
maintains a reference
@@ -52,10 +50,10 @@ public class CompositeContext<T extends TransientComposite>
     {
         TransientComposite composite = get();
 
-        Iterable<Class<?>> types = 
ZestAPI.FUNCTION_COMPOSITE_INSTANCE_OF.apply( composite ).types();
+        Stream<Class<?>> types = ZestAPI.FUNCTION_COMPOSITE_INSTANCE_OF.apply( 
composite ).types();
         return (T) Proxy.newProxyInstance(
             composite.getClass().getClassLoader(),
-            toArray( Class.class, Iterables.<Class>cast( types ) ),
+            types.toArray( Class[]::new ),
             new ContextInvocationhandler() );
     }
 

http://git-wip-us.apache.org/repos/asf/zest-java/blob/bd6fbad9/core/api/src/main/java/org/apache/zest/api/composite/CompositeDescriptor.java
----------------------------------------------------------------------
diff --git 
a/core/api/src/main/java/org/apache/zest/api/composite/CompositeDescriptor.java 
b/core/api/src/main/java/org/apache/zest/api/composite/CompositeDescriptor.java
index 49f9f42..8c48bed 100644
--- 
a/core/api/src/main/java/org/apache/zest/api/composite/CompositeDescriptor.java
+++ 
b/core/api/src/main/java/org/apache/zest/api/composite/CompositeDescriptor.java
@@ -14,6 +14,8 @@
 
 package org.apache.zest.api.composite;
 
+import java.util.stream.Stream;
+
 /**
  * Composite Descriptor.
  */
@@ -22,5 +24,5 @@ public interface CompositeDescriptor
 {
     Class<?> primaryType();
 
-    Iterable<Class<?>> mixinTypes();
+    Stream<Class<?>> mixinTypes();
 }

http://git-wip-us.apache.org/repos/asf/zest-java/blob/bd6fbad9/core/api/src/main/java/org/apache/zest/api/composite/StateDescriptor.java
----------------------------------------------------------------------
diff --git 
a/core/api/src/main/java/org/apache/zest/api/composite/StateDescriptor.java 
b/core/api/src/main/java/org/apache/zest/api/composite/StateDescriptor.java
index 2d3ac07..3780dee 100644
--- a/core/api/src/main/java/org/apache/zest/api/composite/StateDescriptor.java
+++ b/core/api/src/main/java/org/apache/zest/api/composite/StateDescriptor.java
@@ -14,6 +14,7 @@
 
 package org.apache.zest.api.composite;
 
+import java.util.stream.Stream;
 import org.apache.zest.api.common.QualifiedName;
 import org.apache.zest.api.property.PropertyDescriptor;
 
@@ -28,5 +29,5 @@ public interface StateDescriptor
     PropertyDescriptor findPropertyModelByQualifiedName( QualifiedName name )
         throws IllegalArgumentException;
 
-    Iterable<? extends PropertyDescriptor> properties();
+    Stream<? extends PropertyDescriptor> properties();
 }

http://git-wip-us.apache.org/repos/asf/zest-java/blob/bd6fbad9/core/api/src/main/java/org/apache/zest/api/configuration/Configuration.java
----------------------------------------------------------------------
diff --git 
a/core/api/src/main/java/org/apache/zest/api/configuration/Configuration.java 
b/core/api/src/main/java/org/apache/zest/api/configuration/Configuration.java
index 471dc28..6521c8b 100644
--- 
a/core/api/src/main/java/org/apache/zest/api/configuration/Configuration.java
+++ 
b/core/api/src/main/java/org/apache/zest/api/configuration/Configuration.java
@@ -40,8 +40,6 @@ import org.apache.zest.api.usecase.Usecase;
 import org.apache.zest.api.usecase.UsecaseBuilder;
 import org.apache.zest.api.value.ValueSerialization;
 
-import static org.apache.zest.functional.Iterables.first;
-
 /**
  * Provide Configurations for Services. A Service that wants to be configurable
  * should inject a reference to Configuration with the Configuration type:
@@ -257,7 +255,7 @@ public interface Configuration<T>
             Usecase usecase = UsecaseBuilder.newUsecase( "Configuration:" + 
me.identity().get() );
             UnitOfWork buildUow = module.newUnitOfWork( usecase );
 
-            Class<?> type = first( api.serviceDescriptorFor( serviceComposite 
).types() );
+            Class<?> type = api.serviceDescriptorFor( serviceComposite 
).types().findFirst().orElse( null );
             Class<V> configType = serviceModel.configurationType();
 
             // Check for defaults

http://git-wip-us.apache.org/repos/asf/zest-java/blob/bd6fbad9/core/api/src/main/java/org/apache/zest/api/configuration/NoSuchConfigurationException.java
----------------------------------------------------------------------
diff --git 
a/core/api/src/main/java/org/apache/zest/api/configuration/NoSuchConfigurationException.java
 
b/core/api/src/main/java/org/apache/zest/api/configuration/NoSuchConfigurationException.java
index c3ad366..d884311 100644
--- 
a/core/api/src/main/java/org/apache/zest/api/configuration/NoSuchConfigurationException.java
+++ 
b/core/api/src/main/java/org/apache/zest/api/configuration/NoSuchConfigurationException.java
@@ -28,7 +28,7 @@ public class NoSuchConfigurationException extends 
RuntimeException
 
     public NoSuchConfigurationException( Class<? extends Identity> configType,
                                          String identity,
-                                         ConstraintViolationException cause
+                                         Exception cause
     )
     {
         super( "No configuration found for '" + identity + "' and 
configuration " + configType.getName() + " has one or more non-Optional 
properties.", cause );

http://git-wip-us.apache.org/repos/asf/zest-java/blob/bd6fbad9/core/api/src/main/java/org/apache/zest/api/constraint/ConstraintViolationException.java
----------------------------------------------------------------------
diff --git 
a/core/api/src/main/java/org/apache/zest/api/constraint/ConstraintViolationException.java
 
b/core/api/src/main/java/org/apache/zest/api/constraint/ConstraintViolationException.java
index e04bfb9..a0fea69 100644
--- 
a/core/api/src/main/java/org/apache/zest/api/constraint/ConstraintViolationException.java
+++ 
b/core/api/src/main/java/org/apache/zest/api/constraint/ConstraintViolationException.java
@@ -22,14 +22,16 @@ import java.lang.reflect.Member;
 import java.text.MessageFormat;
 import java.util.ArrayList;
 import java.util.Collection;
+import java.util.List;
 import java.util.Locale;
 import java.util.MissingResourceException;
 import java.util.ResourceBundle;
-import java.util.function.Function;
-import java.util.stream.StreamSupport;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
 import org.apache.zest.api.ZestAPI;
 import org.apache.zest.api.composite.Composite;
-import org.apache.zest.functional.Iterables;
+
+import static java.util.stream.Collectors.joining;
 
 /**
  * This Exception is thrown when there is one or more Constraint Violations in 
a method
@@ -49,30 +51,31 @@ public class ConstraintViolationException
     private String methodName;
     private String mixinTypeName;
     private String instanceToString;
-    private Iterable<Class<?>> instanceTypes;
+    private List<Class<?>> instanceTypes;
 
     public ConstraintViolationException( Composite instance, Member method,
                                          Collection<ConstraintViolation> 
constraintViolations
     )
     {
-        this( instance.toString(), ZestAPI.FUNCTION_DESCRIPTOR_FOR.apply( 
instance ).types(), method, constraintViolations );
+        this( instance.toString(), ZestAPI.FUNCTION_DESCRIPTOR_FOR.apply( 
instance )
+            .types(), method, constraintViolations );
     }
 
     public ConstraintViolationException( String instanceToString,
-                                         Iterable<Class<?>> instanceTypes,
+                                         Stream<Class<?>> instanceTypes,
                                          Member method,
                                          Collection<ConstraintViolation> 
violations
     )
     {
         this.instanceToString = instanceToString;
-        this.instanceTypes = instanceTypes;
+        this.instanceTypes = instanceTypes.collect( Collectors.toList() );
         mixinTypeName = method.getDeclaringClass().getName();
         methodName = method.getName();
         this.constraintViolations = violations;
     }
 
     public ConstraintViolationException( String instanceToString,
-                                         Iterable<Class<?>> instanceTypes,
+                                         List<Class<?>> instanceTypes,
                                          String mixinTypeName,
                                          String methodName,
                                          Collection<ConstraintViolation> 
violations
@@ -151,7 +154,7 @@ public class ConstraintViolationException
     {
         String pattern = "Constraint violation in {0}.{1} for method ''{3}'' 
with constraint \"{4}({6})\", for value ''{5}''";
 
-        ArrayList<String> list = new ArrayList<String>();
+        ArrayList<String> list = new ArrayList<>();
         for( ConstraintViolation violation : constraintViolations )
         {
             Locale locale;
@@ -184,20 +187,13 @@ public class ConstraintViolationException
             String name = violation.name();
             Object value = violation.value();
             String classes;
-            if( Iterables.count( instanceTypes ) == 1 )
+            if( instanceTypes.stream().count() == 1 )
             {
-                classes = Iterables.first( instanceTypes ).getSimpleName();
+                classes = 
instanceTypes.stream().findFirst().get().getSimpleName();
             }
             else
             {
-                classes = "[" + Iterables.<Class<?>>toString( instanceTypes, 
new Function<Class<?>, String>()
-                {
-                    @Override
-                    public String apply( Class<?> from )
-                    {
-                        return from.getSimpleName();
-                    }
-                }, "," ) + "]";
+                classes = "[" + instanceTypes.stream().map( 
Class::getSimpleName ).collect( joining( "," ) ) + "]";
             }
             Object[] args = new Object[]
                 {

http://git-wip-us.apache.org/repos/asf/zest-java/blob/bd6fbad9/core/api/src/main/java/org/apache/zest/api/property/StateHolder.java
----------------------------------------------------------------------
diff --git 
a/core/api/src/main/java/org/apache/zest/api/property/StateHolder.java 
b/core/api/src/main/java/org/apache/zest/api/property/StateHolder.java
index d188d3d..e97e9fe 100644
--- a/core/api/src/main/java/org/apache/zest/api/property/StateHolder.java
+++ b/core/api/src/main/java/org/apache/zest/api/property/StateHolder.java
@@ -15,6 +15,7 @@
 package org.apache.zest.api.property;
 
 import java.lang.reflect.AccessibleObject;
+import java.util.stream.Stream;
 
 /**
  * This represents the state of a composite (properties).
@@ -33,5 +34,5 @@ public interface StateHolder
     <T> Property<T> propertyFor( AccessibleObject accessor )
         throws IllegalArgumentException;
 
-    Iterable<? extends Property<?>> properties();
+    Stream<? extends Property<?>> properties();
 }

http://git-wip-us.apache.org/repos/asf/zest-java/blob/bd6fbad9/core/api/src/main/java/org/apache/zest/api/query/grammar/AndPredicate.java
----------------------------------------------------------------------
diff --git 
a/core/api/src/main/java/org/apache/zest/api/query/grammar/AndPredicate.java 
b/core/api/src/main/java/org/apache/zest/api/query/grammar/AndPredicate.java
index d89c65a..32054e2 100644
--- a/core/api/src/main/java/org/apache/zest/api/query/grammar/AndPredicate.java
+++ b/core/api/src/main/java/org/apache/zest/api/query/grammar/AndPredicate.java
@@ -20,7 +20,6 @@ package org.apache.zest.api.query.grammar;
 
 import java.util.function.Predicate;
 import org.apache.zest.api.composite.Composite;
-import org.apache.zest.functional.Specifications;
 
 /**
  * AND Specification.
@@ -28,7 +27,6 @@ import org.apache.zest.functional.Specifications;
 public class AndPredicate
     extends BinaryPredicate
 {
-
     public AndPredicate( Iterable<Predicate<Composite>> operands )
     {
         super( operands );
@@ -37,7 +35,12 @@ public class AndPredicate
     @Override
     public boolean test( Composite item )
     {
-        return Specifications.and( operands ).test( item );
+        Predicate<Composite> master = t -> true;
+        for( Predicate<Composite> p : operands )
+        {
+            master = master.and( p );
+        }
+        return master.test( item );
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/zest-java/blob/bd6fbad9/core/api/src/main/java/org/apache/zest/api/query/grammar/Notpredicate.java
----------------------------------------------------------------------
diff --git 
a/core/api/src/main/java/org/apache/zest/api/query/grammar/Notpredicate.java 
b/core/api/src/main/java/org/apache/zest/api/query/grammar/Notpredicate.java
index 252488f..f480f64 100644
--- a/core/api/src/main/java/org/apache/zest/api/query/grammar/Notpredicate.java
+++ b/core/api/src/main/java/org/apache/zest/api/query/grammar/Notpredicate.java
@@ -20,7 +20,6 @@ package org.apache.zest.api.query.grammar;
 
 import java.util.function.Predicate;
 import org.apache.zest.api.composite.Composite;
-import org.apache.zest.functional.Specifications;
 
 /**
  * NOT Specification.
@@ -42,7 +41,7 @@ public class Notpredicate implements Predicate<Composite>
     @Override
     public boolean test( Composite item )
     {
-        return Specifications.not( operand ).test( item );
+        return operand.negate().test( item );
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/zest-java/blob/bd6fbad9/core/api/src/main/java/org/apache/zest/api/query/grammar/OrPredicate.java
----------------------------------------------------------------------
diff --git 
a/core/api/src/main/java/org/apache/zest/api/query/grammar/OrPredicate.java 
b/core/api/src/main/java/org/apache/zest/api/query/grammar/OrPredicate.java
index 27c91e9..0e8c0a9 100644
--- a/core/api/src/main/java/org/apache/zest/api/query/grammar/OrPredicate.java
+++ b/core/api/src/main/java/org/apache/zest/api/query/grammar/OrPredicate.java
@@ -20,7 +20,6 @@ package org.apache.zest.api.query.grammar;
 
 import java.util.function.Predicate;
 import org.apache.zest.api.composite.Composite;
-import org.apache.zest.functional.Specifications;
 
 /**
  * OR Specification.
@@ -37,7 +36,12 @@ public class OrPredicate
     @Override
     public boolean test( Composite item )
     {
-        return Specifications.or( operands ).test( item );
+        Predicate<Composite> master = t -> false;
+        for( Predicate<Composite> p : operands )
+        {
+            master = master.or( p );
+        }
+        return master.test( item );
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/zest-java/blob/bd6fbad9/core/api/src/main/java/org/apache/zest/api/service/importer/InstanceImporter.java
----------------------------------------------------------------------
diff --git 
a/core/api/src/main/java/org/apache/zest/api/service/importer/InstanceImporter.java
 
b/core/api/src/main/java/org/apache/zest/api/service/importer/InstanceImporter.java
index e13e9c5..8f2410e 100644
--- 
a/core/api/src/main/java/org/apache/zest/api/service/importer/InstanceImporter.java
+++ 
b/core/api/src/main/java/org/apache/zest/api/service/importer/InstanceImporter.java
@@ -14,21 +14,14 @@
 
 package org.apache.zest.api.service.importer;
 
-import java.util.function.Function;
+import java.util.stream.Stream;
 import org.apache.zest.api.injection.scope.Structure;
 import org.apache.zest.api.service.ImportedServiceDescriptor;
 import org.apache.zest.api.service.ServiceImporter;
 import org.apache.zest.api.service.ServiceImporterException;
 import org.apache.zest.api.structure.Application;
 import org.apache.zest.api.structure.Layer;
-import org.apache.zest.api.structure.MetaInfoHolder;
 import org.apache.zest.api.structure.Module;
-import org.apache.zest.functional.Iterables;
-
-import static org.apache.zest.functional.Iterables.filter;
-import static org.apache.zest.functional.Iterables.first;
-import static org.apache.zest.functional.Iterables.map;
-import static org.apache.zest.functional.Specifications.notNull;
 
 /**
  * Return a predefined service instance that was provided as meta-info. Search 
for meta-info in the following order:
@@ -50,26 +43,25 @@ public final class InstanceImporter<T>
     public T importService( final ImportedServiceDescriptor serviceDescriptor )
         throws ServiceImporterException
     {
-        T instance = null;
-        Iterable<MetaInfoHolder> holders = Iterables.iterable( 
serviceDescriptor, module, layer, application );
-        for( final MetaInfoHolder metaInfoHolder : holders )
-        {
-            Function<Class<?>, T> metaFinder = new Function<Class<?>, T>()
-            {
-                @Override
-                @SuppressWarnings( "unchecked" )
-                public T apply( Class<?> type )
-                {
-                    return (T) metaInfoHolder.metaInfo( type );
-                }
-            };
-            instance = first( filter( notNull(), map( metaFinder, 
serviceDescriptor.types() ) ) );
-            if( instance != null )
-            {
-                break;
-            }
-        }
-        return instance;
+        return Stream.of( serviceDescriptor, module, layer, application )
+            .flatMap( holder -> serviceDescriptor.types().map( type -> (T) 
holder.metaInfo( type ) ) )
+            .filter( meta -> meta != null )
+            .findFirst().orElse( null );
+
+//        T instance = null;
+//        Iterable<MetaInfoHolder> holders = Iterables.iterable( 
serviceDescriptor, module, layer, application );
+//        for( final MetaInfoHolder metaInfoHolder : holders )
+//        {
+//            Function<Class<?>, T> metaFinder = type -> (T) 
metaInfoHolder.metaInfo( type );
+//
+//
+//            instance = first( filter( notNull(), map( metaFinder, 
serviceDescriptor.types() ) ) );
+//            if( instance != null )
+//            {
+//                break;
+//            }
+//        }
+//        return instance;
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/zest-java/blob/bd6fbad9/core/api/src/main/java/org/apache/zest/api/service/importer/NewObjectImporter.java
----------------------------------------------------------------------
diff --git 
a/core/api/src/main/java/org/apache/zest/api/service/importer/NewObjectImporter.java
 
b/core/api/src/main/java/org/apache/zest/api/service/importer/NewObjectImporter.java
index 55df2c0..57924ca 100644
--- 
a/core/api/src/main/java/org/apache/zest/api/service/importer/NewObjectImporter.java
+++ 
b/core/api/src/main/java/org/apache/zest/api/service/importer/NewObjectImporter.java
@@ -35,7 +35,7 @@ public final class NewObjectImporter<T>
     public T importService( ImportedServiceDescriptor serviceDescriptor )
         throws ServiceImporterException
     {
-        return obf.newObject( (Class<T>) Iterables.first( 
serviceDescriptor.types() ) );
+        return obf.newObject( (Class<T>) 
serviceDescriptor.types().findFirst().orElse( null ));
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/zest-java/blob/bd6fbad9/core/api/src/main/java/org/apache/zest/api/service/importer/ServiceSelectorImporter.java
----------------------------------------------------------------------
diff --git 
a/core/api/src/main/java/org/apache/zest/api/service/importer/ServiceSelectorImporter.java
 
b/core/api/src/main/java/org/apache/zest/api/service/importer/ServiceSelectorImporter.java
index 515e8e4..daefa9d 100644
--- 
a/core/api/src/main/java/org/apache/zest/api/service/importer/ServiceSelectorImporter.java
+++ 
b/core/api/src/main/java/org/apache/zest/api/service/importer/ServiceSelectorImporter.java
@@ -48,7 +48,7 @@ public final class ServiceSelectorImporter<T>
         throws ServiceImporterException
     {
         Predicate<ServiceReference<?>> selector = serviceDescriptor.metaInfo( 
Predicate.class );
-        Class serviceType = Iterables.first( serviceDescriptor.types() );
+        Class serviceType = serviceDescriptor.types().findFirst().orElse( null 
);
         Iterable<ServiceReference<T>> services = locator.findServices( 
serviceType );
         List<ServiceReference<T>> filteredServices = new ArrayList<>();
         for( ServiceReference<T> service : services )

http://git-wip-us.apache.org/repos/asf/zest-java/blob/bd6fbad9/core/api/src/main/java/org/apache/zest/api/structure/Application.java
----------------------------------------------------------------------
diff --git 
a/core/api/src/main/java/org/apache/zest/api/structure/Application.java 
b/core/api/src/main/java/org/apache/zest/api/structure/Application.java
index 1786d11..601747d 100644
--- a/core/api/src/main/java/org/apache/zest/api/structure/Application.java
+++ b/core/api/src/main/java/org/apache/zest/api/structure/Application.java
@@ -14,6 +14,7 @@
  */
 package org.apache.zest.api.structure;
 
+import java.util.stream.Stream;
 import org.apache.zest.api.activation.Activation;
 import org.apache.zest.api.activation.ActivationEventListenerRegistration;
 
@@ -90,4 +91,6 @@ public interface Application
      * @return Application Descriptor
      */
     ApplicationDescriptor descriptor();
+
+    Stream<? extends Layer> layers();
 }

http://git-wip-us.apache.org/repos/asf/zest-java/blob/bd6fbad9/core/api/src/main/java/org/apache/zest/api/structure/Layer.java
----------------------------------------------------------------------
diff --git a/core/api/src/main/java/org/apache/zest/api/structure/Layer.java 
b/core/api/src/main/java/org/apache/zest/api/structure/Layer.java
index 2f6c28e..cf4db21 100644
--- a/core/api/src/main/java/org/apache/zest/api/structure/Layer.java
+++ b/core/api/src/main/java/org/apache/zest/api/structure/Layer.java
@@ -15,6 +15,7 @@
 
 package org.apache.zest.api.structure;
 
+import java.util.stream.Stream;
 import org.apache.zest.api.activation.Activation;
 import org.apache.zest.api.activation.ActivationEventListenerRegistration;
 
@@ -28,4 +29,6 @@ public interface Layer
      * @return the Layer's name
      */
     String name();
+
+    Stream<? extends Module> modules();
 }

http://git-wip-us.apache.org/repos/asf/zest-java/blob/bd6fbad9/core/api/src/main/java/org/apache/zest/api/structure/Module.java
----------------------------------------------------------------------
diff --git a/core/api/src/main/java/org/apache/zest/api/structure/Module.java 
b/core/api/src/main/java/org/apache/zest/api/structure/Module.java
index 09842c2..e5a0aa6 100644
--- a/core/api/src/main/java/org/apache/zest/api/structure/Module.java
+++ b/core/api/src/main/java/org/apache/zest/api/structure/Module.java
@@ -14,14 +14,20 @@
  */
 package org.apache.zest.api.structure;
 
+import java.util.stream.Stream;
 import org.apache.zest.api.activation.ActivationEventListenerRegistration;
+import org.apache.zest.api.composite.Composite;
 import org.apache.zest.api.composite.TransientBuilderFactory;
+import org.apache.zest.api.composite.TransientComposite;
 import org.apache.zest.api.composite.TransientDescriptor;
+import org.apache.zest.api.entity.EntityComposite;
 import org.apache.zest.api.entity.EntityDescriptor;
 import org.apache.zest.api.injection.scope.Structure;
 import org.apache.zest.api.object.ObjectDescriptor;
 import org.apache.zest.api.object.ObjectFactory;
 import org.apache.zest.api.query.QueryBuilderFactory;
+import org.apache.zest.api.service.ImportedServiceDescriptor;
+import org.apache.zest.api.service.ServiceDescriptor;
 import org.apache.zest.api.service.ServiceFinder;
 import org.apache.zest.api.unitofwork.UnitOfWorkFactory;
 import org.apache.zest.api.value.ValueBuilderFactory;
@@ -77,4 +83,10 @@ public interface Module
      */
     ValueDescriptor valueDescriptor( String typeName );
 
+    Stream<? extends TransientDescriptor> transientComposites();
+    Stream<? extends ValueDescriptor> valueComposites();
+    Stream<? extends ServiceDescriptor> serviceComposites();
+    Stream<? extends EntityDescriptor> entityComposites();
+    Stream<? extends ImportedServiceDescriptor> importedServices();
+    Stream<? extends ObjectDescriptor> objects();
 }

http://git-wip-us.apache.org/repos/asf/zest-java/blob/bd6fbad9/core/api/src/main/java/org/apache/zest/api/type/HasTypes.java
----------------------------------------------------------------------
diff --git a/core/api/src/main/java/org/apache/zest/api/type/HasTypes.java 
b/core/api/src/main/java/org/apache/zest/api/type/HasTypes.java
index 862b7eb..0bc0a35 100644
--- a/core/api/src/main/java/org/apache/zest/api/type/HasTypes.java
+++ b/core/api/src/main/java/org/apache/zest/api/type/HasTypes.java
@@ -18,10 +18,12 @@
  */
 package org.apache.zest.api.type;
 
+import java.util.stream.Stream;
+
 /**
  * Has types.
  */
 public interface HasTypes
 {
-    Iterable<Class<?>> types();
+    Stream<Class<?>> types();
 }

http://git-wip-us.apache.org/repos/asf/zest-java/blob/bd6fbad9/core/api/src/main/java/org/apache/zest/api/type/MatchTypeSpecification.java
----------------------------------------------------------------------
diff --git 
a/core/api/src/main/java/org/apache/zest/api/type/MatchTypeSpecification.java 
b/core/api/src/main/java/org/apache/zest/api/type/MatchTypeSpecification.java
index 03035a6..579d9ec 100644
--- 
a/core/api/src/main/java/org/apache/zest/api/type/MatchTypeSpecification.java
+++ 
b/core/api/src/main/java/org/apache/zest/api/type/MatchTypeSpecification.java
@@ -34,13 +34,14 @@ public class MatchTypeSpecification
     @Override
     public boolean test( HasTypes item )
     {
-        for( Class<?> type : item.types() )
-        {
-            if( matchType.isAssignableFrom( type ) )
-            {
-                return true;
-            }
-        }
-        return false;
+        return item.types().anyMatch( matchType::isAssignableFrom );
+//        for( Class<?> type : item.types() )
+//        {
+//            if( matchType.isAssignableFrom( type ) )
+//            {
+//                return true;
+//            }
+//        }
+//        return false;
     }
 }

http://git-wip-us.apache.org/repos/asf/zest-java/blob/bd6fbad9/core/api/src/main/java/org/apache/zest/api/type/ValueCompositeType.java
----------------------------------------------------------------------
diff --git 
a/core/api/src/main/java/org/apache/zest/api/type/ValueCompositeType.java 
b/core/api/src/main/java/org/apache/zest/api/type/ValueCompositeType.java
index 6d53b94..4bae2df 100644
--- a/core/api/src/main/java/org/apache/zest/api/type/ValueCompositeType.java
+++ b/core/api/src/main/java/org/apache/zest/api/type/ValueCompositeType.java
@@ -14,6 +14,8 @@
 package org.apache.zest.api.type;
 
 import java.lang.reflect.Type;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
 import org.apache.zest.api.association.AssociationDescriptor;
 import org.apache.zest.api.property.PropertyDescriptor;
 import org.apache.zest.api.util.Classes;
@@ -35,26 +37,26 @@ public final class ValueCompositeType
 
     public ValueCompositeType( ValueDescriptor model )
     {
-        super( model.types() );
+        super( model.types().collect( Collectors.toList() ) );
         this.model = model;
     }
 
-    public Iterable<? extends PropertyDescriptor> properties()
+    public Stream<? extends PropertyDescriptor> properties()
     {
         return model.state().properties();
     }
 
-    public Iterable<? extends AssociationDescriptor> associations()
+    public Stream<? extends AssociationDescriptor> associations()
     {
         return model.state().associations();
     }
 
-    public Iterable<? extends AssociationDescriptor> manyAssociations()
+    public Stream<? extends AssociationDescriptor> manyAssociations()
     {
         return model.state().manyAssociations();
     }
 
-    public Iterable<? extends AssociationDescriptor> namedAssociations()
+    public Stream<? extends AssociationDescriptor> namedAssociations()
     {
         return model.state().namedAssociations();
     }

http://git-wip-us.apache.org/repos/asf/zest-java/blob/bd6fbad9/core/api/src/main/java/org/apache/zest/api/type/ValueType.java
----------------------------------------------------------------------
diff --git a/core/api/src/main/java/org/apache/zest/api/type/ValueType.java 
b/core/api/src/main/java/org/apache/zest/api/type/ValueType.java
index a9ed888..dc28f10 100644
--- a/core/api/src/main/java/org/apache/zest/api/type/ValueType.java
+++ b/core/api/src/main/java/org/apache/zest/api/type/ValueType.java
@@ -15,7 +15,9 @@
 package org.apache.zest.api.type;
 
 import java.util.Collections;
+import java.util.List;
 import java.util.function.Function;
+import java.util.stream.Stream;
 import org.apache.zest.api.util.NullArgumentException;
 import org.apache.zest.functional.Iterables;
 
@@ -106,17 +108,17 @@ public class ValueType
         }
         return false;
     }
-    protected final Iterable<Class<?>> types;
+    protected final List<Class<?>> types;
 
     public ValueType( Class<?> type )
     {
-        this( Collections.singleton( type ) );
+        this( Collections.singletonList( type ) );
     }
 
     @SuppressWarnings( "unchecked" )
-    public ValueType( Iterable<? extends Class<?>> types )
+    public ValueType( List<Class<?>> types )
     {
-        this.types = (Iterable<Class<?>>) types;
+        this.types = types;
     }
 
     public Class<?> mainType()
@@ -125,25 +127,15 @@ public class ValueType
     }
 
     @Override
-    public Iterable<Class<?>> types()
+    public Stream<Class<?>> types()
     {
-        return types;
+        return types.stream();
     }
 
     @Override
     public String toString()
     {
-        String name = Iterables.toString(
-            types,
-            new Function<Class<?>, String>()
-            {
-                @Override
-                public String apply( Class<?> item )
-                {
-                    return item.getName();
-                }
-            },
-            "," );
+        String name = Iterables.toString( types, Class::getName, "," );
         if( name.contains( "," ) )
         {
             name = "{" + name + "}";

http://git-wip-us.apache.org/repos/asf/zest-java/blob/bd6fbad9/core/api/src/main/java/org/apache/zest/api/unitofwork/EntityTypeNotFoundException.java
----------------------------------------------------------------------
diff --git 
a/core/api/src/main/java/org/apache/zest/api/unitofwork/EntityTypeNotFoundException.java
 
b/core/api/src/main/java/org/apache/zest/api/unitofwork/EntityTypeNotFoundException.java
index 917c019..b51bc8c 100644
--- 
a/core/api/src/main/java/org/apache/zest/api/unitofwork/EntityTypeNotFoundException.java
+++ 
b/core/api/src/main/java/org/apache/zest/api/unitofwork/EntityTypeNotFoundException.java
@@ -15,10 +15,10 @@
  */
 package org.apache.zest.api.unitofwork;
 
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
 
-import java.util.function.Function;
-
-import static org.apache.zest.functional.Iterables.fold;
+import static java.util.stream.StreamSupport.stream;
 
 /**
  * Zest exception to be thrown in case that an entity composite
@@ -29,32 +29,13 @@ public class EntityTypeNotFoundException
 {
     private final String compositeType;
 
-    public EntityTypeNotFoundException( String entityType, String moduleName, 
Iterable<String> visibility )
+    public EntityTypeNotFoundException( String entityType, String moduleName, 
Stream<String> visibility )
     {
         super( "Could not find an EntityComposite of type " + entityType + " 
in module [" + moduleName + "].\n" +
-               "\tThe following entity types are visible:\n" + 
join(visibility) );
+               "\tThe following entity types are visible:\n" + 
visibility.collect( Collectors.joining( "\n" ) ) );
         this.compositeType = entityType;
     }
 
-    private static String join( Iterable<String> visibility )
-    {
-        return fold( new Function<String, String>()
-        {
-            StringBuilder result;
-            {
-                result = new StringBuilder();
-            }
-
-            @Override
-            public String apply( String type )
-            {
-                result.append( type );
-                result.append( "\n" );
-                return result.toString();
-            }
-        }, visibility );
-    }
-
     public String compositeType()
     {
         return compositeType;

http://git-wip-us.apache.org/repos/asf/zest-java/blob/bd6fbad9/core/api/src/main/java/org/apache/zest/api/unitofwork/NoSuchEntityException.java
----------------------------------------------------------------------
diff --git 
a/core/api/src/main/java/org/apache/zest/api/unitofwork/NoSuchEntityException.java
 
b/core/api/src/main/java/org/apache/zest/api/unitofwork/NoSuchEntityException.java
index 8651470..89b5d09 100644
--- 
a/core/api/src/main/java/org/apache/zest/api/unitofwork/NoSuchEntityException.java
+++ 
b/core/api/src/main/java/org/apache/zest/api/unitofwork/NoSuchEntityException.java
@@ -14,10 +14,13 @@
 package org.apache.zest.api.unitofwork;
 
 import java.util.function.Function;
+import java.util.stream.Stream;
 import org.apache.zest.api.entity.EntityReference;
 import org.apache.zest.api.usecase.Usecase;
 import org.apache.zest.functional.Iterables;
 
+import static java.util.Arrays.stream;
+
 /**
  * This exception indicates that the requested Entity with the given
  * identity does not exist.
@@ -45,9 +48,9 @@ public class NoSuchEntityException
         this.usecase = usecase;
     }
 
-    public NoSuchEntityException( EntityReference identity, Iterable<Class<?>> 
types, Usecase usecase )
+    public NoSuchEntityException( EntityReference identity, Stream<Class<?>> 
types, Usecase usecase )
     {
-        this( identity, castToArray( types ), usecase );
+        this( identity, types.toArray( Class[]::new ), usecase );
     }
 
     public EntityReference identity()
@@ -73,35 +76,7 @@ public class NoSuchEntityException
 
     private static String toString( Class<?>[] mixinTypes )
     {
-        Iterable<String> map = Iterables.map( new Function<Class<?>, String>()
-        {
-            @Override
-            public String apply( Class<?> item )
-            {
-                return item.getName();
-            }
-        }, Iterables.iterable( mixinTypes ) );
-        return Iterables.fold( new Function<String, String>()
-        {
-            StringBuilder result;
-            boolean first = true;
-
-            {
-                result = new StringBuilder();
-                result.append( "[" );
-            }
-
-            @Override
-            public String apply( String strings )
-            {
-                if( !first )
-                {
-                    result.append( ',' );
-                }
-                first = false;
-                result.append( strings );
-                return result.toString() + "]";
-            }
-        }, map );
+        String reduced = stream( mixinTypes ).map( Class::getName ).reduce( 
"", ( ret, name ) -> ret + "," + name );
+        return "[" + reduced.substring( 1 ) + "]";
     }
 }

http://git-wip-us.apache.org/repos/asf/zest-java/blob/bd6fbad9/core/api/src/main/java/org/apache/zest/api/util/Annotations.java
----------------------------------------------------------------------
diff --git a/core/api/src/main/java/org/apache/zest/api/util/Annotations.java 
b/core/api/src/main/java/org/apache/zest/api/util/Annotations.java
index a144b61..529b358 100644
--- a/core/api/src/main/java/org/apache/zest/api/util/Annotations.java
+++ b/core/api/src/main/java/org/apache/zest/api/util/Annotations.java
@@ -18,65 +18,36 @@ import java.lang.annotation.Annotation;
 import java.lang.reflect.AccessibleObject;
 import java.lang.reflect.AnnotatedElement;
 import java.lang.reflect.Type;
+import java.util.Arrays;
 import java.util.function.Function;
 import java.util.function.Predicate;
-import org.apache.zest.functional.Iterables;
+import java.util.stream.Stream;
 
 import static org.apache.zest.api.util.Classes.interfacesOf;
 import static org.apache.zest.api.util.Classes.typeOf;
-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.map;
 
 /**
  * Useful methods for handling Annotations.
  */
 public final class Annotations
 {
-    public static Function<Type, Iterable<Annotation>> ANNOTATIONS_OF = 
Classes.forTypes( new Function<Type, Iterable<Annotation>>()
-    {
-        @Override
-        public Iterable<Annotation> apply( Type type )
-        {
-            return Iterables.iterable( Classes.RAW_CLASS.apply( type 
).getAnnotations() );
-        }
-    } );
+    public static Function<Type, Stream<Annotation>> ANNOTATIONS_OF =
+        Classes.forTypes( type -> Arrays.stream( Classes.RAW_CLASS.apply( type 
).getAnnotations() ) );
+//        Classes.forTypes( type -> Iterables.iterable( 
Classes.RAW_CLASS.apply( type ).getAnnotations() ) );
 
     public static Predicate<AnnotatedElement> hasAnnotation( final Class<? 
extends Annotation> annotationType )
     {
-        return new Predicate<AnnotatedElement>()
-        {
-            @Override
-            public boolean test( AnnotatedElement element )
-            {
-                return element.getAnnotation( annotationType ) != null;
-            }
-        };
+        return element -> element.getAnnotation( annotationType ) != null;
     }
 
     public static Function<Annotation, Class<? extends Annotation>> type()
     {
-        return new Function<Annotation, Class<? extends Annotation>>()
-        {
-            @Override
-            public Class<? extends Annotation> apply( Annotation annotation )
-            {
-                return annotation.annotationType();
-            }
-        };
+        return Annotation::annotationType;
     }
 
     public static Predicate<Annotation> isType( final Class<? extends 
Annotation> annotationType )
     {
-        return new Predicate<Annotation>()
-        {
-            @Override
-            public boolean test( Annotation annotation )
-            {
-                return annotation.annotationType().equals( annotationType );
-            }
-        };
+        return annotation -> annotation.annotationType().equals( 
annotationType );
     }
 
     public static <T extends Annotation> T annotationOn( Type type, Class<T> 
annotationType )
@@ -84,9 +55,13 @@ public final class Annotations
         return annotationType.cast( Classes.RAW_CLASS.apply( type 
).getAnnotation( annotationType ) );
     }
 
-    public static Iterable<Annotation> findAccessorAndTypeAnnotationsIn( 
AccessibleObject accessor )
+    public static Stream<Annotation> findAccessorAndTypeAnnotationsIn( 
AccessibleObject accessor )
     {
-        return flatten( iterable( accessor.getAnnotations() ),
-                        flattenIterables( map( Annotations.ANNOTATIONS_OF, 
interfacesOf( typeOf( accessor ) ) ) ) );
+        return Stream.concat(
+            Arrays.stream( accessor.getAnnotations() ),
+            interfacesOf( typeOf( accessor ) ).flatMap( ANNOTATIONS_OF )
+        );
+//        return flatten( iterable( accessor.getAnnotations() ),
+//                        flattenIterables( map( Annotations.ANNOTATIONS_OF, 
interfacesOf( typeOf( accessor ) ) ) ) );
     }
 }

http://git-wip-us.apache.org/repos/asf/zest-java/blob/bd6fbad9/core/api/src/main/java/org/apache/zest/api/util/Classes.java
----------------------------------------------------------------------
diff --git a/core/api/src/main/java/org/apache/zest/api/util/Classes.java 
b/core/api/src/main/java/org/apache/zest/api/util/Classes.java
index b965121..7bc6f67 100644
--- a/core/api/src/main/java/org/apache/zest/api/util/Classes.java
+++ b/core/api/src/main/java/org/apache/zest/api/util/Classes.java
@@ -25,6 +25,7 @@ import java.lang.reflect.Type;
 import java.lang.reflect.TypeVariable;
 import java.lang.reflect.WildcardType;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.HashMap;
 import java.util.LinkedHashSet;
 import java.util.List;
@@ -32,17 +33,12 @@ import java.util.Map;
 import java.util.Set;
 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.ModelDescriptor;
-import org.apache.zest.functional.Iterables;
 
-import static org.apache.zest.functional.Iterables.cast;
-import static org.apache.zest.functional.Iterables.empty;
-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.map;
-import static org.apache.zest.functional.Iterables.matchesAny;
-import static org.apache.zest.functional.Iterables.prepend;
+import static java.util.stream.Stream.concat;
+import static java.util.stream.StreamSupport.stream;
 
 /**
  * Useful methods for handling Classes.
@@ -82,14 +78,9 @@ public final class Classes
      * Return the same class if it's not a primitive class. This can therefore 
safely be used on all types
      * to ensure that they are not primitives.
      */
-    private static final Function<Type, Type> WRAPPER_CLASS = new 
Function<Type, Type>()
-    {
-        @Override
-        public Type apply( Type aClass )
-        {
-            Type wrapperClass = wrapperClasses.get( aClass );
-            return wrapperClass == null ? aClass : wrapperClass;
-        }
+    private static final Function<Type, Type> WRAPPER_CLASS = clazz -> {
+        Type wrapperClass = wrapperClasses.get( clazz );
+        return wrapperClass == null ? clazz : wrapperClass;
     };
 
     /**
@@ -98,132 +89,114 @@ public final class Classes
      * to ensure that they are primitives if possible.
      */
     @SuppressWarnings( "UnusedDeclaration" )
-    private static final Function<Type, Type> PRIMITIVE_CLASS = new 
Function<Type, Type>()
-    {
-        @Override
-        public Type apply( Type aClass )
-        {
-            Type primitiveClass = primitiveClasses.get( aClass );
-            return primitiveClass == null ? aClass : primitiveClass;
-        }
+    private static final Function<Type, Type> PRIMITIVE_CLASS = aClass -> {
+        Type primitiveClass = primitiveClasses.get( aClass );
+        return primitiveClass == null ? aClass : primitiveClass;
     };
 
     /**
      * Function that extract the raw class of a type.
      */
-    public static final Function<Type, Class<?>> RAW_CLASS = new 
Function<Type, Class<?>>()
-    {
-        @Override
-        public Class<?> apply( Type genericType )
+    public static final Function<Type, Class<?>> RAW_CLASS = genericType -> {
+        // Calculate raw type
+        if( genericType instanceof Class )
         {
-            // Calculate raw type
-            if( genericType instanceof Class )
-            {
-                return (Class<?>) genericType;
-            }
-            else if( genericType instanceof ParameterizedType )
-            {
-                return (Class<?>) ( (ParameterizedType) genericType 
).getRawType();
-            }
-            else if( genericType instanceof TypeVariable )
-            {
-                return (Class<?>) ( (TypeVariable) genericType 
).getGenericDeclaration();
-            }
-            else if( genericType instanceof WildcardType )
-            {
-                return (Class<?>) ( (WildcardType) genericType 
).getUpperBounds()[ 0];
-            }
-            else if( genericType instanceof GenericArrayType )
-            {
-                Object temp = Array.newInstance( (Class<?>) ( 
(GenericArrayType) genericType ).getGenericComponentType(), 0 );
-                return temp.getClass();
-            }
-            throw new IllegalArgumentException( "Could not extract the raw 
class of " + genericType );
+            return (Class<?>) genericType;
+        }
+        else if( genericType instanceof ParameterizedType )
+        {
+            return (Class<?>) ( (ParameterizedType) genericType ).getRawType();
+        }
+        else if( genericType instanceof TypeVariable )
+        {
+            return (Class<?>) ( (TypeVariable) genericType 
).getGenericDeclaration();
         }
+        else if( genericType instanceof WildcardType )
+        {
+            return (Class<?>) ( (WildcardType) genericType ).getUpperBounds()[ 
0 ];
+        }
+        else if( genericType instanceof GenericArrayType )
+        {
+            Object temp = Array.newInstance( (Class<?>) ( (GenericArrayType) 
genericType ).getGenericComponentType(), 0 );
+            return temp.getClass();
+        }
+        throw new IllegalArgumentException( "Could not extract the raw class 
of " + genericType );
     };
 
-    private static final Function<AccessibleObject, Type> TYPE_OF = new 
Function<AccessibleObject, Type>()
-    {
-        @Override
-        public Type apply( AccessibleObject accessor )
+    private static final Function<AccessibleObject, Type> TYPE_OF = accessor 
-> {
+        if( accessor instanceof Method )
         {
-            return accessor instanceof Method ? ( (Method) accessor 
).getGenericReturnType() : ( (Field) accessor ).getGenericType();
+            return ( (Method) accessor ).getGenericReturnType();
         }
+        return ( (Field) accessor ).getGenericType();
     };
 
-    private static final Function<Type, Iterable<Class<?>>> CLASS_HIERARCHY = 
new Function<Type, Iterable<Class<?>>>()
+    private static final Function<Type, Stream<Class<?>>> CLASS_HIERARCHY = 
new Function<Type, Stream<Class<?>>>()
     {
         @Override
-        @SuppressWarnings( {"raw", "unchecked"} )
-        public Iterable<Class<?>> apply( Type type )
+        public Stream<Class<?>> apply( Type type )
         {
             if( type == null )
             {
-                return empty();
+                return Stream.empty();
             }
             if( type.equals( Object.class ) )
             {
-                Class<?> aClass = (Class<?>) type;
-                return cast( iterable( aClass ) );
+                return Stream.of( (Class<?>) type );
             }
             else
             {
                 type = RAW_CLASS.apply( type );
                 Class superclass = ( (Class) type ).getSuperclass();
-                return prepend( (Class<?>) type, apply( superclass ) );
+                return concat( Stream.of( (Class<?>) type ), apply( superclass 
) );
             }
         }
     };
 
     @SuppressWarnings( "raw" )
-    private static final Function<Type, Iterable<Type>> INTERFACES_OF = new 
Function<Type, Iterable<Type>>()
+    private static final Function<Type, Stream<? extends Type>> INTERFACES_OF 
= new Function<Type, Stream<? extends Type>>()
     {
         @Override
-        public Iterable<Type> apply( Type type )
+        public Stream<? extends Type> apply( Type type )
         {
             Class clazz = RAW_CLASS.apply( type );
 
             if( clazz.isInterface() )
             {
-                Iterable<Type> genericInterfaces = iterable( 
clazz.getGenericInterfaces() );
-                Iterable<Type> flattenIterables = flattenIterables( 
Iterables.map( INTERFACES_OF, genericInterfaces ) );
-                return prepend( type, flattenIterables );
+                Stream<? extends Type> genericInterfaces = Arrays.stream( 
clazz.getGenericInterfaces() );
+                Stream<? extends Type> intfaces = genericInterfaces.flatMap( 
INTERFACES_OF );
+                return concat( Stream.of( type ), intfaces );
             }
             else
             {
                 if( type.equals( Object.class ) )
                 {
-                    return iterable( clazz.getGenericInterfaces() );
+                    return Arrays.stream( clazz.getGenericInterfaces() );
                 }
                 else
                 {
-                    return flatten( flattenIterables( Iterables.map( 
INTERFACES_OF,
-                                                                     iterable( 
clazz.getGenericInterfaces() ) ) ),
-                                    INTERFACES_OF.apply( RAW_CLASS.apply( type 
).getSuperclass() ) );
+                    Stream<Type> stream1 = Arrays.stream( 
clazz.getGenericInterfaces() ).flatMap( INTERFACES_OF );
+                    Stream<Type> stream2 = Stream.of( type )
+                        .map( RAW_CLASS )
+                        .map( Class::getSuperclass )
+                        .map( RAW_CLASS );
+                    return concat( stream1, stream2 );
                 }
             }
         }
     };
 
-    @SuppressWarnings( "raw" )
-    private static final Function<Type, Iterable<Type>> TYPES_OF = new 
Function<Type, Iterable<Type>>()
-    {
-        @Override
-        public Iterable<Type> apply( Type type )
-        {
-            Class clazz = RAW_CLASS.apply( type );
+    private static final Function<Type, Stream<? extends Type>> TYPES_OF = 
type -> {
+        Class clazz = RAW_CLASS.apply( type );
 
-            if( clazz.isInterface() )
-            {
-                Iterable<Type> genericInterfaces = iterable( 
clazz.getGenericInterfaces() );
-                Iterable<Type> flattenIterables = flattenIterables( 
Iterables.map( INTERFACES_OF, genericInterfaces ) );
-                return prepend( clazz, flattenIterables );
-            }
-            else
-            {
-                return flatten( CLASS_HIERARCHY.apply( type ),
-                                flattenIterables( Iterables.map( 
INTERFACES_OF, CLASS_HIERARCHY.apply( type ) ) ) );
-            }
+        if( clazz.isInterface() )
+        {
+            Stream<Type> intfaces = Arrays.stream( 
clazz.getGenericInterfaces() ).flatMap( INTERFACES_OF );
+            return concat( Stream.of(clazz), intfaces );
+        }
+        else
+        {
+            return Stream.of(type).flatMap( CLASS_HIERARCHY ).flatMap( 
INTERFACES_OF ).flatMap( CLASS_HIERARCHY );
         }
     };
 
@@ -232,39 +205,29 @@ public final class Classes
         return TYPE_OF.apply( from );
     }
 
-    public static Iterable<Type> typesOf( Iterable<Type> types )
+    public static Stream<Type> typesOf( Stream<? extends Type> types )
     {
-        Iterable<Type> result = empty();
-        for( Type type : types )
-        {
-            result = flatten( result, typesOf( type ) );
-        }
-        return result;
+        return types.flatMap( TYPES_OF );
     }
 
-    public static Iterable<Type> typesOf( Type type )
+    public static Stream<? extends Type> typesOf( Type type )
     {
         return TYPES_OF.apply( type );
     }
 
-    public static Iterable<? extends Type> interfacesOf( Iterable<? extends 
Type> types )
+    public static Stream<? extends Type> interfacesOf( Stream<? extends Type> 
types )
     {
-        Iterable<Type> result = empty();
-        for( Type type : types )
-        {
-            result = flatten( result, interfacesOf( type ) );
-        }
-        return result;
+        return types.flatMap( INTERFACES_OF );
     }
 
-    public static Iterable<Type> interfacesOf( Type type )
+    public static Stream<? extends Type> interfacesOf( Type type )
     {
-        return INTERFACES_OF.apply( type );
+        return Stream.of(type).flatMap( INTERFACES_OF );
     }
 
-    public static Iterable<Class<?>> classHierarchy( Class<?> type )
+    public static Stream<Class<?>> classHierarchy( Class<?> type )
     {
-        return CLASS_HIERARCHY.apply( type );
+        return Stream.of(type).flatMap( CLASS_HIERARCHY );
     }
 
     public static Type wrapperClass( Type type )
@@ -272,17 +235,9 @@ public final class Classes
         return WRAPPER_CLASS.apply( type );
     }
 
-    public static Predicate<Class<?>> isAssignableFrom( final Class clazz )
+    public static Predicate<Class<?>> isAssignableFrom( final Class<?> clazz )
     {
-        return new Predicate<Class<?>>()
-        {
-            @Override
-            @SuppressWarnings( "unchecked" )
-            public boolean test( Class<?> item )
-            {
-                return clazz.isAssignableFrom( item );
-            }
-        };
+        return clazz::isAssignableFrom;
     }
 
     @SuppressWarnings( "raw" )
@@ -310,28 +265,14 @@ public final class Classes
         };
     }
 
-    public static <T> Function<Type, Iterable<T>> forClassHierarchy( final 
Function<Class<?>, Iterable<T>> function )
+    public static <T> Function<Type, Stream<T>> forClassHierarchy( final 
Function<Class<?>, Stream<T>> function )
     {
-        return new Function<Type, Iterable<T>>()
-        {
-            @Override
-            public Iterable<T> apply( Type type )
-            {
-                return flattenIterables( Iterables.map( function, 
CLASS_HIERARCHY.apply( type ) ) );
-            }
-        };
+        return type -> Stream.of( type ).flatMap( CLASS_HIERARCHY ).flatMap( 
function );
     }
 
-    public static <T> Function<Type, Iterable<T>> forTypes( final 
Function<Type, Iterable<T>> function )
+    public static <T> Function<Type, Stream<T>> forTypes( final Function<Type, 
Stream<T>> function )
     {
-        return new Function<Type, Iterable<T>>()
-        {
-            @Override
-            public Iterable<T> apply( Type type )
-            {
-                return flattenIterables( Iterables.map( function, 
TYPES_OF.apply( type ) ) );
-            }
-        };
+        return type -> Stream.of(type).flatMap( TYPES_OF ).flatMap( function );
     }
 
     @SuppressWarnings( "raw" )
@@ -414,19 +355,27 @@ public final class Classes
 
     @SuppressWarnings( "UnusedDeclaration" )
     public static <AnnotationType extends Annotation>
-        AnnotationType findAnnotationOfTypeOrAnyOfSuperTypes( Class<?> type, 
Class<AnnotationType> annotationClass )
-    {
-        AnnotationType result = null;
-        for( Type clazz : Classes.TYPES_OF.apply( type ) )
-        {
-            result = Classes.RAW_CLASS.apply( clazz ).getAnnotation( 
annotationClass );
-            if( result != null )
-            {
-                break;
-            }
-        }
-
-        return result;
+    AnnotationType findAnnotationOfTypeOrAnyOfSuperTypes( Class<?> type, 
Class<AnnotationType> annotationClass )
+    {
+        return Stream.of( type )
+            .flatMap( TYPES_OF )
+            .map( RAW_CLASS )
+            .map( clazz -> clazz.getAnnotation(annotationClass))
+            .filter(  annot -> annot != null )
+            .findAny().get();
+//
+//
+//        AnnotationType result = null;
+//        for( Type clazz : Classes.TYPES_OF.apply( type ) )
+//        {
+//            result = Classes.RAW_CLASS.apply( clazz ).getAnnotation( 
annotationClass );
+//            if( result != null )
+//            {
+//                break;
+//            }
+//        }
+//
+//        return result;
     }
 
     public static Predicate<Member> memberNamed( final String name )
@@ -445,9 +394,9 @@ public final class Classes
      * Given a type variable, find what it resolves to given the declaring 
class where type
      * variable was found and a top class that extends the declaring class.
      *
-     * @param name The TypeVariable name.
+     * @param name           The TypeVariable name.
      * @param declaringClass The class where the TypeVariable is declared.
-     * @param topClass The top class that extends the declaringClass
+     * @param topClass       The top class that extends the declaringClass
      *
      * @return The Type instance of the given TypeVariable
      */
@@ -479,55 +428,87 @@ public final class Classes
             return resolvedType;
         }
 
-        List<Type> types = new ArrayList<>();
-        for( Type type : current.getGenericInterfaces() )
-        {
-            Iterable<Type> interfaces = Classes.INTERFACES_OF.apply( type );
-            for( Type anInterface : interfaces )
-            {
-                if( !types.contains( anInterface ) )
-                {
-                    types.add( anInterface );
-                }
-            }
-            types.add( type );
-        }
-
-        if( current.getGenericSuperclass() != null )
-        {
-            types.add( current.getGenericSuperclass() );
-        }
-
-        for( Type type : types )
-        {
-            Class subClass;
-            if( type instanceof ParameterizedType )
-            {
-                ParameterizedType pt = (ParameterizedType) type;
-                Type[] args = pt.getActualTypeArguments();
-                Class clazz = (Class) pt.getRawType();
-                TypeVariable[] vars = clazz.getTypeParameters();
-                for( int i = 0; i < vars.length; i++ )
-                {
-                    TypeVariable var = vars[ i];
-                    Type mappedType = args[ i];
-                    mappings.put( var, mappedType );
-                }
-                subClass = (Class) pt.getRawType();
-            }
-            else
-            {
-                subClass = (Class) type;
-            }
-
-            Type resolvedType = resolveTypeVariable( name, declaringClass, 
mappings, subClass );
-            if( resolvedType != null )
-            {
-                return resolvedType;
-            }
-        }
-
-        return null;
+        Stream<? extends Type> stream1 = Arrays.stream( 
current.getGenericInterfaces() )
+            .flatMap( INTERFACES_OF )
+            .distinct();
+
+        return concat( Stream.of(current.getGenericSuperclass()), stream1)
+                .map( type ->
+                      {
+                          Class subClass;
+                          if( type instanceof ParameterizedType )
+                          {
+                              ParameterizedType pt = (ParameterizedType) type;
+                              Type[] args = pt.getActualTypeArguments();
+                              Class clazz = (Class) pt.getRawType();
+                              TypeVariable[] vars = clazz.getTypeParameters();
+                              for( int i = 0; i < vars.length; i++ )
+                              {
+                                  TypeVariable var = vars[ i ];
+                                  Type mappedType = args[ i ];
+                                  mappings.put( var, mappedType );
+                              }
+                              subClass = (Class) pt.getRawType();
+                          }
+                          else
+                          {
+                              subClass = (Class) type;
+                          }
+                          return subClass;
+                      } )
+                .map( subClass -> resolveTypeVariable( name, declaringClass, 
mappings, subClass ) )
+                .filter( type -> type != null )
+                .findAny().get();
+
+//        List<Type> types = new ArrayList<>();
+//        for( Type type : current.getGenericInterfaces() )
+//        {
+//            Iterable<Type> interfaces = Classes.INTERFACES_OF.apply( type );
+//            for( Type anInterface : interfaces )
+//            {
+//                if( !types.contains( anInterface ) )
+//                {
+//                    types.add( anInterface );
+//                }
+//            }
+//            types.add( type );
+//        }
+//
+//        if( current.getGenericSuperclass() != null )
+//        {
+//            types.add( current.getGenericSuperclass() );
+//        }
+//
+//        for( Type type : types )
+//        {
+//            Class subClass;
+//            if( type instanceof ParameterizedType )
+//            {
+//                ParameterizedType pt = (ParameterizedType) type;
+//                Type[] args = pt.getActualTypeArguments();
+//                Class clazz = (Class) pt.getRawType();
+//                TypeVariable[] vars = clazz.getTypeParameters();
+//                for( int i = 0; i < vars.length; i++ )
+//                {
+//                    TypeVariable var = vars[ i ];
+//                    Type mappedType = args[ i ];
+//                    mappings.put( var, mappedType );
+//                }
+//                subClass = (Class) pt.getRawType();
+//            }
+//            else
+//            {
+//                subClass = (Class) type;
+//            }
+//
+//            Type resolvedType = resolveTypeVariable( name, declaringClass, 
mappings, subClass );
+//            if( resolvedType != null )
+//            {
+//                return resolvedType;
+//            }
+//        }
+//
+//        return null;
     }
 
     /**
@@ -597,100 +578,35 @@ public final class Classes
 
     public static Predicate<ModelDescriptor> modelTypeSpecification( final 
String className )
     {
-        return new Predicate<ModelDescriptor>()
-        {
-            @Override
-            public boolean test( ModelDescriptor item )
-            {
-                return matchesAny( new Predicate<String>()
-                {
-                    @Override
-                    public boolean test( String item )
-                    {
-                        return item.equals( className );
-                    }
-                }, map( new Function<Class<?>, String>()
-                {
-                    @Override
-                    public String apply( Class<?> item )
-                    {
-                        return item.getName();
-                    }
-                }, item.types() ) );
-            }
-        };
+        return item ->
+            stream( item.types().spliterator(), false )
+                .map( Class::getName ).anyMatch( typeName -> typeName.equals( 
className ) );
     }
 
     @SuppressWarnings( "raw" )
     public static Predicate<ModelDescriptor> exactTypeSpecification( final 
Class type )
     {
-        return new Predicate<ModelDescriptor>()
-        {
-            @Override
-            public boolean test( ModelDescriptor item )
-            {
-                return matchesAny( new Predicate<Class<?>>()
-                {
-                    @Override
-                    public boolean test( Class<?> item )
-                    {
-                        return item.equals( type );
-                    }
-                }, item.types() );
-            }
-        };
+        return item -> item.types().anyMatch( clazz -> clazz.equals( type ) );
     }
 
     @SuppressWarnings( "raw" )
-    public static Predicate<ModelDescriptor> assignableTypeSpecification( 
final Class type )
+    public static Predicate<ModelDescriptor> assignableTypeSpecification( 
final Class<?> type )
     {
-        return new Predicate<ModelDescriptor>()
-        {
-            @Override
-            public boolean test( ModelDescriptor item )
-            {
-                return matchesAny( new Predicate<Class<?>>()
-                {
-                    @Override
-                    @SuppressWarnings( "unchecked" )
-                    public boolean test( Class<?> itemType )
-                    {
-                        return !type.equals( itemType ) && 
type.isAssignableFrom( itemType );
-                    }
-                }, item.types() );
-            }
-        };
+        return item ->
+            item.types().anyMatch(
+                itemType -> !type.equals( itemType ) && type.isAssignableFrom( 
itemType )
+            );
     }
 
     @SuppressWarnings( "raw" )
-    public static String toString( Iterable<? extends Class> type )
+    public static String toString( Stream<? extends Class> types )
     {
-        StringBuilder builder = new StringBuilder();
-        builder.append( "[" );
-        boolean first = true;
-        for( Class c : type )
-        {
-            if( !first )
-            {
-                builder.append( "," );
-            }
-            first = false;
-            builder.append( c.getSimpleName() );
-        }
-        builder.append( "]" );
-        return builder.toString();
+        return "[" + types.map(Class::getSimpleName).collect( 
Collectors.joining(",")) +"]";
     }
 
     public static Function<Type, String> toClassName()
     {
-        return new Function<Type, String>()
-        {
-            @Override
-            public String apply( Type type )
-            {
-                return RAW_CLASS.apply( type ).getName();
-            }
-        };
+        return type -> RAW_CLASS.apply( type ).getName();
     }
 
     private Classes()

http://git-wip-us.apache.org/repos/asf/zest-java/blob/bd6fbad9/core/api/src/main/java/org/apache/zest/api/util/Constructors.java
----------------------------------------------------------------------
diff --git a/core/api/src/main/java/org/apache/zest/api/util/Constructors.java 
b/core/api/src/main/java/org/apache/zest/api/util/Constructors.java
index fd09eb3..c77531d 100644
--- a/core/api/src/main/java/org/apache/zest/api/util/Constructors.java
+++ b/core/api/src/main/java/org/apache/zest/api/util/Constructors.java
@@ -20,7 +20,9 @@ package org.apache.zest.api.util;
 
 import java.lang.reflect.Constructor;
 import java.lang.reflect.Type;
+import java.util.Arrays;
 import java.util.function.Function;
+import java.util.stream.Stream;
 
 import static org.apache.zest.functional.Iterables.iterable;
 
@@ -29,12 +31,6 @@ import static org.apache.zest.functional.Iterables.iterable;
  */
 public final class Constructors
 {
-    public static final Function<Type, Iterable<Constructor<?>>> 
CONSTRUCTORS_OF = Classes.forClassHierarchy( new Function<Class<?>, 
Iterable<Constructor<?>>>()
-    {
-        @Override
-        public Iterable<Constructor<?>> apply( Class<?> type )
-        {
-            return iterable( type.getDeclaredConstructors() );
-        }
-    } );
+    public static final Function<Type, Stream<Constructor<?>>> CONSTRUCTORS_OF 
=
+        Classes.forClassHierarchy( type -> Arrays.stream( 
type.getDeclaredConstructors() ) );
 }

Reply via email to