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:26 UTC

[23/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/api/src/main/java/org/apache/zest/api/util/Fields.java
----------------------------------------------------------------------
diff --git a/core/api/src/main/java/org/apache/zest/api/util/Fields.java b/core/api/src/main/java/org/apache/zest/api/util/Fields.java
index 9e5768c..43f796d 100644
--- a/core/api/src/main/java/org/apache/zest/api/util/Fields.java
+++ b/core/api/src/main/java/org/apache/zest/api/util/Fields.java
@@ -20,8 +20,10 @@ package org.apache.zest.api.util;
 
 import java.lang.reflect.Field;
 import java.lang.reflect.Type;
+import java.util.Arrays;
 import java.util.function.BiFunction;
 import java.util.function.Function;
+import java.util.stream.Stream;
 import org.apache.zest.functional.Iterables;
 
 import static org.apache.zest.functional.Iterables.iterable;
@@ -31,21 +33,14 @@ import static org.apache.zest.functional.Iterables.iterable;
  */
 public final class Fields
 {
-    public static final BiFunction<Class<?>, String, Field> FIELD_NAMED = new BiFunction<Class<?>, String, Field>()
-    {
-        @Override
-        public Field apply( Class<?> aClass, String name )
-        {
-            return Iterables.first( Iterables.filter( Classes.memberNamed( name ), FIELDS_OF.apply( aClass ) ) );
-        }
-    };
+    public static final Function<Type, Stream<Field>> FIELDS_OF =
+        Classes.forClassHierarchy( type -> Arrays.stream( type.getDeclaredFields() ) );
+
+    public static final BiFunction<Class<?>, String, Field> FIELD_NAMED = ( clazz, name ) ->
+        FIELDS_OF.apply( clazz ).filter( Classes.memberNamed( name ) ).findFirst().orElse( null );
 
-    public static final Function<Type, Iterable<Field>> FIELDS_OF = Classes.forClassHierarchy( new Function<Class<?>, Iterable<Field>>()
+    public static Stream<Field> fieldsOf( Type type )
     {
-        @Override
-        public Iterable<Field> apply( Class<?> type )
-        {
-            return iterable( type.getDeclaredFields() );
-        }
-    } );
+        return Stream.of( type ).flatMap( FIELDS_OF );
+    }
 }

http://git-wip-us.apache.org/repos/asf/zest-java/blob/bd6fbad9/core/api/src/main/java/org/apache/zest/api/util/Methods.java
----------------------------------------------------------------------
diff --git a/core/api/src/main/java/org/apache/zest/api/util/Methods.java b/core/api/src/main/java/org/apache/zest/api/util/Methods.java
index 98095b7..ad45c18 100644
--- a/core/api/src/main/java/org/apache/zest/api/util/Methods.java
+++ b/core/api/src/main/java/org/apache/zest/api/util/Methods.java
@@ -20,31 +20,25 @@ package org.apache.zest.api.util;
 
 import java.lang.reflect.Method;
 import java.lang.reflect.Type;
+import java.util.Arrays;
 import java.util.function.Function;
 import java.util.function.Predicate;
-
-import static org.apache.zest.functional.Iterables.iterable;
+import java.util.stream.Stream;
 
 /**
  * Useful methods for handling Methods.
  */
 public class Methods
 {
-    public static final Predicate<Type> HAS_METHODS = new Predicate<Type>()
-    {
-        @Override
-        public boolean test( Type item )
-        {
-            return Classes.RAW_CLASS.apply( item ).getDeclaredMethods().length > 0;
-        }
-    };
+    public static final Predicate<Type> HAS_METHODS =
+        item -> Classes.RAW_CLASS.apply( item ).getDeclaredMethods().length > 0;
+
+    public static final Function<Type, Stream<Method>> METHODS_OF = Classes.forTypes( type ->
+        Stream.of( type ).map( Classes.RAW_CLASS ).flatMap( clazz -> Arrays.stream( clazz.getDeclaredMethods() ) )
+    );
 
-    public static final Function<Type, Iterable<Method>> METHODS_OF = Classes.forTypes( new Function<Type, Iterable<Method>>()
+    public static Stream<Method> methodsOf( Type type )
     {
-        @Override
-        public Iterable<Method> apply( Type type )
-        {
-            return iterable( Classes.RAW_CLASS.apply( type ).getDeclaredMethods() );
-        }
-    } );
+        return Stream.of(type).flatMap( METHODS_OF );
+    }
 }

http://git-wip-us.apache.org/repos/asf/zest-java/blob/bd6fbad9/core/api/src/test/java/org/apache/zest/api/util/ClassesTest.java
----------------------------------------------------------------------
diff --git a/core/api/src/test/java/org/apache/zest/api/util/ClassesTest.java b/core/api/src/test/java/org/apache/zest/api/util/ClassesTest.java
index 4a9321d..088a400 100644
--- a/core/api/src/test/java/org/apache/zest/api/util/ClassesTest.java
+++ b/core/api/src/test/java/org/apache/zest/api/util/ClassesTest.java
@@ -20,17 +20,13 @@ import java.lang.reflect.Type;
 import java.lang.reflect.TypeVariable;
 import java.util.HashSet;
 import java.util.Set;
-import java.util.function.Predicate;
 import org.junit.Test;
-import org.apache.zest.functional.Iterables;
-import org.apache.zest.functional.Specifications;
 
+import static org.apache.zest.api.util.Classes.interfacesOf;
+import static org.apache.zest.api.util.Classes.interfacesWithMethods;
 import static org.hamcrest.CoreMatchers.equalTo;
 import static org.hamcrest.CoreMatchers.is;
 import static org.junit.Assert.assertThat;
-import static org.apache.zest.api.util.Classes.interfacesOf;
-import static org.apache.zest.api.util.Classes.interfacesWithMethods;
-import static org.apache.zest.functional.Iterables.count;
 
 /**
  * Tests for Classes
@@ -41,9 +37,9 @@ public class ClassesTest
     @Test
     public void givenClassWithInterfacesWhenInterfacesOfThenGetCorrectSet()
     {
-        assertThat( "one interface returned", count( interfacesOf( A.class ) ), equalTo( 1L ) );
-        assertThat( "two interface returned", count( interfacesOf( B.class ) ), equalTo( 2L ) );
-        assertThat( "tree interface returned", count( interfacesOf( C.class ) ), equalTo( 4L ) );
+        assertThat( "one interface returned", interfacesOf( A.class ).count(), equalTo( 1L ) );
+        assertThat( "two interface returned", interfacesOf( B.class ).count(), equalTo( 2L ) );
+        assertThat( "tree interface returned", interfacesOf( C.class ).count(), equalTo( 4L ) );
     }
 
     @Test
@@ -59,10 +55,11 @@ public class ClassesTest
     @Test
     public void givenClassesWithInterfacesWhenGetInterfacesWithMethodsThenGetCorrectSet()
     {
-        Iterable<Type> types = Iterables.filter( Methods.HAS_METHODS, interfacesOf( C.class ) );
-        assertThat( "one interface returned", count( types ), equalTo( 1L ) );
-        assertThat( "correct interface returned", Iterables.matchesAny( (Predicate) Specifications.in( B.class ), Iterables
-            .<Class<?>>cast( types ) ), is( true ) );
+        assertThat( "one interface returned", interfacesOf( C.class ).filter( Methods.HAS_METHODS )
+            .count(), equalTo( 1L ) );
+        boolean isIn = interfacesOf( C.class ).filter( Methods.HAS_METHODS )
+            .anyMatch( B.class::equals );
+        assertThat( "correct interface returned", isIn, is( true ) );
     }
 
     @Test
@@ -82,7 +79,7 @@ public class ClassesTest
         throws NoSuchMethodException
     {
         Type returnType = Generics.class.getMethod( "wildcard" ).getGenericReturnType();
-        Type wildcardType = ( (ParameterizedType) returnType ).getActualTypeArguments()[ 0];
+        Type wildcardType = ( (ParameterizedType) returnType ).getActualTypeArguments()[ 0 ];
         assertThat( "Return type is A", Classes.RAW_CLASS.apply( wildcardType ), equalTo( (Class) A.class ) );
     }
 
@@ -97,15 +94,15 @@ public class ClassesTest
             System.out.println( type + "=" + resolvedType );
             switch( method.getName() )
             {
-                case "type":
-                    assertThat( resolvedType, equalTo( (Type) String.class ) );
-                    break;
-                case "type1":
-                    assertThat( resolvedType, equalTo( (Type) String.class ) );
-                    break;
-                case "type2":
-                    assertThat( resolvedType, equalTo( (Type) Long.class ) );
-                    break;
+            case "type":
+                assertThat( resolvedType, equalTo( (Type) String.class ) );
+                break;
+            case "type1":
+                assertThat( resolvedType, equalTo( (Type) String.class ) );
+                break;
+            case "type2":
+                assertThat( resolvedType, equalTo( (Type) Long.class ) );
+                break;
             }
         }
     }
@@ -174,7 +171,6 @@ public class ClassesTest
     {
 
         public void doStuff();
-
     }
 
     interface C
@@ -186,7 +182,6 @@ public class ClassesTest
     {
 
         Iterable<? extends A> wildcard();
-
     }
 
     interface Type1
@@ -201,14 +196,11 @@ public class ClassesTest
         TYPE1 type1();
 
         TYPE2 type2();
-
     }
 
     interface Type3<TYPE>
     {
 
         TYPE type();
-
     }
-
 }

http://git-wip-us.apache.org/repos/asf/zest-java/blob/bd6fbad9/core/bootstrap/src/main/java/org/apache/zest/bootstrap/AssemblySpecifications.java
----------------------------------------------------------------------
diff --git a/core/bootstrap/src/main/java/org/apache/zest/bootstrap/AssemblySpecifications.java b/core/bootstrap/src/main/java/org/apache/zest/bootstrap/AssemblySpecifications.java
index a17238b..2787deb 100644
--- a/core/bootstrap/src/main/java/org/apache/zest/bootstrap/AssemblySpecifications.java
+++ b/core/bootstrap/src/main/java/org/apache/zest/bootstrap/AssemblySpecifications.java
@@ -18,32 +18,17 @@
  */
 package org.apache.zest.bootstrap;
 
+import java.util.Arrays;
 import java.util.function.Predicate;
 import org.apache.zest.api.type.HasTypes;
-import org.apache.zest.functional.Specifications;
 
 /**
  * Utility specifications for Assemblies.
  */
 public class AssemblySpecifications
 {
-    public static Predicate<HasTypes> types( final Class... types )
+    public static Predicate<HasTypes> ofAnyType( final Class... types )
     {
-        return new Predicate<HasTypes>()
-        {
-            @Override
-            public boolean test( HasTypes item )
-            {
-
-                for( Class<?> type : item.types() )
-                {
-                    if( Specifications.in( types ).test( type ) )
-                    {
-                        return true;
-                    }
-                }
-                return false;
-            }
-        };
+        return item -> item.types().anyMatch( a -> Arrays.stream( types ).anyMatch( a::equals ) );
     }
 }

http://git-wip-us.apache.org/repos/asf/zest-java/blob/bd6fbad9/core/bootstrap/src/main/java/org/apache/zest/bootstrap/builder/ModuleDeclaration.java
----------------------------------------------------------------------
diff --git a/core/bootstrap/src/main/java/org/apache/zest/bootstrap/builder/ModuleDeclaration.java b/core/bootstrap/src/main/java/org/apache/zest/bootstrap/builder/ModuleDeclaration.java
index 065e9d8..4582d7a 100644
--- a/core/bootstrap/src/main/java/org/apache/zest/bootstrap/builder/ModuleDeclaration.java
+++ b/core/bootstrap/src/main/java/org/apache/zest/bootstrap/builder/ModuleDeclaration.java
@@ -28,7 +28,6 @@ import org.apache.zest.bootstrap.ModuleAssembly;
 import static org.apache.zest.api.util.Classes.isAssignableFrom;
 import static org.apache.zest.functional.Iterables.filter;
 import static org.apache.zest.functional.Iterables.toList;
-import static org.apache.zest.functional.Specifications.not;
 
 /**
  * Provides declared {@link org.apache.zest.api.structure.Module} information that the {@link ApplicationBuilder} can use.
@@ -94,7 +93,7 @@ public class ModuleDeclaration
         throws AssemblyException
     {
         List<Class<?>> notAssemblers = toList(
-            filter( not( isAssignableFrom( Assembler.class ) ),
+            filter( isAssignableFrom( Assembler.class ).negate(),
                     assemblerClasses )
         );
         if( !notAssemblers.isEmpty() )

http://git-wip-us.apache.org/repos/asf/zest-java/blob/bd6fbad9/core/bootstrap/src/test/java/org/apache/zest/bootstrap/DocumentationSupport.java
----------------------------------------------------------------------
diff --git a/core/bootstrap/src/test/java/org/apache/zest/bootstrap/DocumentationSupport.java b/core/bootstrap/src/test/java/org/apache/zest/bootstrap/DocumentationSupport.java
index bd081d0..058f070 100644
--- a/core/bootstrap/src/test/java/org/apache/zest/bootstrap/DocumentationSupport.java
+++ b/core/bootstrap/src/test/java/org/apache/zest/bootstrap/DocumentationSupport.java
@@ -37,7 +37,7 @@ public class DocumentationSupport
 
         public boolean test( ObjectAssembly item )
         {
-            return Iterables.toList( item.types() ).contains( String.class );
+            return item.types().anyMatch( type -> type.equals(String.class) );
         }
 
     };

http://git-wip-us.apache.org/repos/asf/zest-java/blob/bd6fbad9/core/functional/src/main/java/org/apache/zest/functional/ForEach.java
----------------------------------------------------------------------
diff --git a/core/functional/src/main/java/org/apache/zest/functional/ForEach.java b/core/functional/src/main/java/org/apache/zest/functional/ForEach.java
deleted file mode 100644
index 23d1619..0000000
--- a/core/functional/src/main/java/org/apache/zest/functional/ForEach.java
+++ /dev/null
@@ -1,97 +0,0 @@
-/*
- * Copyright (c) 2010, Rickard Öberg. All Rights Reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- */
-package org.apache.zest.functional;
-
-import java.util.Iterator;
-import java.util.function.Function;
-import java.util.function.Predicate;
-
-/**
- * When using Iterables with map() and filter() the code often reads "in reverse", with the first item last in the code.
- * Example: Iterables.map(function,Iterables.filter(specification, iterable))
- * <p>
- * This ForEach class reverses that order and makes the code more readable, and allows easy application of visitors on iterables.
- * </p>
- * <p>
- * Example: forEach(iterable).filter(specification).map(function).visit(visitor)
- * </p>
- */
-public final class ForEach<T>
-    implements Iterable<T>
-{
-    public static <T> ForEach<T> forEach( Iterable<T> iterable )
-    {
-        return new ForEach<>( iterable );
-    }
-
-    private final Iterable<T> iterable;
-
-    public ForEach( Iterable<T> iterable )
-    {
-        this.iterable = iterable;
-    }
-
-    @Override
-    public Iterator<T> iterator()
-    {
-        return iterable.iterator();
-    }
-
-    public ForEach<T> filter( Predicate<? super T> specification )
-    {
-        return new ForEach<>( Iterables.filter( specification, iterable ) );
-    }
-
-    public <TO> ForEach<TO> map( Function<? /* super T */, TO> function )
-    {
-        return new ForEach<>( Iterables.map( function, iterable ) );
-    }
-
-    public <TO> ForEach<TO> flatten()
-    {
-        Iterable<Iterable<TO>> original = iterable();
-        Iterable<TO> iterable1 = Iterables.flattenIterables( original );
-        return new ForEach<>( iterable1 );
-    }
-
-    @SuppressWarnings( "unchecked" )
-    private <TO> Iterable<Iterable<TO>> iterable()
-    {
-        return (Iterable<Iterable<TO>>) iterable;
-    }
-
-    public T last()
-    {
-        T lastItem = null;
-        for( T item : iterable )
-        {
-            lastItem = item;
-        }
-        return lastItem;
-    }
-
-    public <ThrowableType extends Throwable> boolean visit( final Visitor<T, ThrowableType> visitor )
-        throws ThrowableType
-    {
-        for( T item : iterable )
-        {
-            if( !visitor.visit( item ) )
-            {
-                return false;
-            }
-        }
-
-        return true;
-    }
-}

http://git-wip-us.apache.org/repos/asf/zest-java/blob/bd6fbad9/core/functional/src/main/java/org/apache/zest/functional/Functions.java
----------------------------------------------------------------------
diff --git a/core/functional/src/main/java/org/apache/zest/functional/Functions.java b/core/functional/src/main/java/org/apache/zest/functional/Functions.java
deleted file mode 100644
index f5688db..0000000
--- a/core/functional/src/main/java/org/apache/zest/functional/Functions.java
+++ /dev/null
@@ -1,237 +0,0 @@
-/*
- * Copyright (c) 2010, Rickard Öberg. All Rights Reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- */
-package org.apache.zest.functional;
-
-import java.util.Comparator;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.function.BiFunction;
-import java.util.function.Function;
-import java.util.function.Predicate;
-
-/**
- * Utility functions. Combine these with methods in Iterables, for example. See FunctionsTest for usages.
- */
-public final class Functions
-{
-    public static <A, B, C> BiFunction<Function<? super B, C>, Function<A, B>, Function<A, C>> compose()
-    {
-        return Functions::compose;
-    }
-
-    /**
-     * compose(F1(M,T),F2(F,M)) = F1(F2(F)) -&gt; T
-     *
-     * @param outer The outer/encapsulating function
-     * @param inner The inner/encapsulated function
-     *
-     * @return A function that is a composition of an outer and inner function.
-     */
-    public static <FROM, MIDDLE, TO> Function<FROM, TO> compose( final Function<? super MIDDLE, TO> outer,
-                                                                 final Function<FROM, MIDDLE> inner
-    )
-    {
-        return from -> outer.apply( inner.apply( from ) );
-    }
-
-    public static <TO, FROM extends TO> Function<FROM, TO> identity()
-    {
-        return from -> from;
-    }
-
-    public static <FROM, TO> Function<FROM, TO> fromMap( final Map<FROM, TO> map )
-    {
-        return map::get;
-    }
-
-    public static <T> Function<T, T> withDefault( final T defaultValue )
-    {
-        return from -> from == null ? defaultValue : from;
-    }
-
-    public static Function<Number, Long> longSum()
-    {
-        return new Function<Number, Long>()
-        {
-            private long sum = 0;
-
-            @Override
-            public Long apply( Number number )
-            {
-                sum += number.longValue();
-                return sum;
-            }
-        };
-    }
-
-    public static Function<Number, Integer> intSum()
-    {
-        return new Function<Number, Integer>()
-        {
-            private int sum = 0;
-
-            @Override
-            public Integer apply( Number number )
-            {
-                sum += number.intValue();
-                return sum;
-            }
-        };
-    }
-
-    /**
-     * Count the number of items in an iterable that matches a given specification.
-     *
-     * Sample usage: last( apply( count( in( "X" ) ), iterable( "X","Y","X","X","Y" ) ) )
-     * Returns: 3
-     *
-     * @param specification The items that adhere to the Specification is counted.
-     * @param <T> The type of the items.
-     *
-     * @return A Function that can count items adhering to a Specification.
-     */
-    public static <T> Function<T, Integer> count( final Predicate<T> specification )
-    {
-        return new Function<T, Integer>()
-        {
-            int count;
-
-            @Override
-            public Integer apply( T item )
-            {
-                if( specification.test( item ) )
-                {
-                    count++;
-                }
-
-                return count;
-            }
-        };
-    }
-
-    /**
-     * Find out the index of an item matching a given specification in an iterable.
-     * Returns -1 if it is not found.
-     *
-     * @param specification The Specification that specifies what to look for.
-     * @param <T> The type of the items.
-     *
-     * @return A Function that will provide the 'index' where the Specifcation is fulfilled. The Function will
-     * return -1 if the current item doesn't fulfill the Specification.
-     */
-    public static <T> Function<T, Integer> indexOf( final Predicate<T> specification )
-    {
-        return new Function<T, Integer>()
-        {
-            int index = -1;
-            int current = 0;
-
-            @Override
-            public Integer apply( T item )
-            {
-                if( index == -1 && specification.test( item ) )
-                {
-                    index = current;
-                }
-
-                current++;
-
-                return index;
-            }
-        };
-    }
-
-    /**
-     * Find out the index of an item in an iterable.
-     *
-     * @param item The item to look for.
-     * @param iterable The Iterable to search.
-     * @param <T> The type of the items.
-     *
-     * @return The index in the Iterable where the item is located.
-     */
-    @SuppressWarnings( "unchecked" )
-    public static <T> int indexOf( T item, Iterable<T> iterable )
-    {
-        return Iterables.first( Iterables.filter( Specifications.not( Specifications.in( -1 ) ),
-                                                  Iterables.map( indexOf( Specifications.in( item ) ), iterable ) ) );
-    }
-
-    /**
-     * Only apply given function on objects that satisfies the given specification.
-     *
-     * @param specification A Specification that specifies what should be included in the filtered result.
-     * @param function The function to be applied to items that fulfills the Specification
-     * @param <T> The type of the items.
-     *
-     * @return A Function that performs the filter operation when applied to Iterables.
-     */
-    public static <T> Function<T, T> filteredMap( final Predicate<T> specification, final Function<T, T> function )
-    {
-        return new Function<T, T>()
-        {
-            @Override
-            public T apply( T from )
-            {
-                return specification.test( from ) ? function.apply( from ) : from;
-            }
-        };
-    }
-
-    /**
-     * Creates a comparator that takes a function as input. The returned comparator will use the
-     * function once for each item in the list to be sorted by Collections.sort.
-     *
-     * This should be used if the function to generate the sort key from an object is expensive, so
-     * that it is not done many times for each item in a list.
-     *
-     * @param comparableFunction The Function that the Comparator will delegate to.
-     * @param <T>                The generic type to be used.
-     *
-     * @return A comparator that uses a Function for the compare operation.
-     */
-    @SuppressWarnings( "raw" )
-    public static <T> Comparator<T> comparator( final Function<T, Comparable> comparableFunction )
-    {
-        return new Comparator<T>()
-        {
-            Map<T, Comparable> compareKeys = new HashMap<>();
-
-            @Override
-            @SuppressWarnings( "unchecked" )
-            public int compare( T o1, T o2 )
-            {
-                Comparable key1 = compareKeys.get( o1 );
-                if( key1 == null )
-                {
-                    key1 = comparableFunction.apply( o1 );
-                    compareKeys.put( o1, key1 );
-                }
-
-                Comparable key2 = compareKeys.get( o2 );
-                if( key2 == null )
-                {
-                    key2 = comparableFunction.apply( o2 );
-                    compareKeys.put( o2, key2 );
-                }
-
-                return key1.compareTo( key2 );
-            }
-        };
-    }
-
-    private Functions()
-    {
-    }
-}

http://git-wip-us.apache.org/repos/asf/zest-java/blob/bd6fbad9/core/functional/src/main/java/org/apache/zest/functional/Iterables.java
----------------------------------------------------------------------
diff --git a/core/functional/src/main/java/org/apache/zest/functional/Iterables.java b/core/functional/src/main/java/org/apache/zest/functional/Iterables.java
index bc6f076..6fec219 100644
--- a/core/functional/src/main/java/org/apache/zest/functional/Iterables.java
+++ b/core/functional/src/main/java/org/apache/zest/functional/Iterables.java
@@ -70,36 +70,6 @@ public final class Iterables
         return EMPTY;
     }
 
-    public static <T> Iterable<T> constant( final T item )
-    {
-        return new Iterable<T>()
-        {
-            @Override
-            public Iterator<T> iterator()
-            {
-                return new Iterator<T>()
-                {
-                    @Override
-                    public boolean hasNext()
-                    {
-                        return true;
-                    }
-
-                    @Override
-                    public T next()
-                    {
-                        return item;
-                    }
-
-                    @Override
-                    public void remove()
-                    {
-                    }
-                };
-            }
-        };
-    }
-
     public static <T> Iterable<T> limit( final int limitItems, final Iterable<T> iterable )
     {
         return new Iterable<T>()
@@ -453,59 +423,52 @@ public final class Iterables
 
     public static <T> Iterable<T> prepend( final T item, final Iterable<T> iterable )
     {
-        return new Iterable<T>()
+        return () -> new Iterator<T>()
         {
+            private T first = item;
+            private Iterator<T> iterator;
+
             @Override
-            public Iterator<T> iterator()
+            public boolean hasNext()
             {
-                return new Iterator<T>()
+                if( first != null )
                 {
-                    T first = item;
-                    Iterator<T> iterator;
-
-                    @Override
-                    public boolean hasNext()
+                    return true;
+                }
+                else
+                {
+                    if( iterator == null )
                     {
-                        if( first != null )
-                        {
-                            return true;
-                        }
-                        else
-                        {
-                            if( iterator == null )
-                            {
-                                iterator = iterable.iterator();
-                            }
-                        }
-
-                        return iterator.hasNext();
+                        iterator = iterable.iterator();
                     }
+                }
 
-                    @Override
-                    public T next()
+                return iterator.hasNext();
+            }
+
+            @Override
+            public T next()
+            {
+                if( first != null )
+                {
+                    try
                     {
-                        if( first != null )
-                        {
-                            try
-                            {
-                                return first;
-                            }
-                            finally
-                            {
-                                first = null;
-                            }
-                        }
-                        else
-                        {
-                            return iterator.next();
-                        }
+                        return first;
                     }
-
-                    @Override
-                    public void remove()
+                    finally
                     {
+                        first = null;
                     }
-                };
+                }
+                else
+                {
+                    return iterator.next();
+                }
+            }
+
+            @Override
+            public void remove()
+            {
             }
         };
     }

http://git-wip-us.apache.org/repos/asf/zest-java/blob/bd6fbad9/core/functional/src/main/java/org/apache/zest/functional/Specifications.java
----------------------------------------------------------------------
diff --git a/core/functional/src/main/java/org/apache/zest/functional/Specifications.java b/core/functional/src/main/java/org/apache/zest/functional/Specifications.java
deleted file mode 100644
index 467f468..0000000
--- a/core/functional/src/main/java/org/apache/zest/functional/Specifications.java
+++ /dev/null
@@ -1,208 +0,0 @@
-/*
- * Copyright (c) 2010, Rickard Öberg. All Rights Reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- */
-package org.apache.zest.functional;
-
-import java.util.function.Function;
-import java.util.function.Predicate;
-
-/**
- * Common generic specification expressions
- */
-public class Specifications
-{
-    public static <T> Predicate<T> TRUE()
-    {
-        return new Predicate<T>()
-        {
-            @Override
-            public boolean test( T instance )
-            {
-                return true;
-            }
-        };
-    }
-
-    public static <T> Predicate<T> not( final Predicate<T> specification )
-    {
-        return new Predicate<T>()
-        {
-            @Override
-            public boolean test( T instance )
-            {
-                return !specification.test( instance );
-            }
-        };
-    }
-
-    @SafeVarargs
-    public static <T> AndSpecification<T> and( final Predicate<T>... specifications )
-    {
-        return and( Iterables.iterable( specifications ) );
-    }
-
-    public static <T> AndSpecification<T> and( final Iterable<Predicate<T>> specifications )
-    {
-        return new AndSpecification<>( specifications );
-    }
-
-    @SafeVarargs
-    public static <T> OrSpecification<T> or( final Predicate<T>... specifications )
-    {
-        return or( Iterables.iterable( specifications ) );
-    }
-
-    public static <T> OrSpecification<T> or( final Iterable<Predicate<T>> specifications )
-    {
-        return new OrSpecification<>( specifications );
-    }
-
-    @SafeVarargs
-    public static <T> Predicate<T> in( final T... allowed )
-    {
-        return in( Iterables.iterable( allowed ) );
-    }
-
-    public static <T> Predicate<T> in( final Iterable<T> allowed )
-    {
-        return new Predicate<T>()
-        {
-            @Override
-            public boolean test( T item )
-            {
-                for( T allow : allowed )
-                {
-                    if( allow.equals( item ) )
-                    {
-                        return true;
-                    }
-                }
-                return false;
-            }
-        };
-    }
-
-    public static <T> Predicate<T> notNull()
-    {
-        return new Predicate<T>()
-        {
-            @Override
-            public boolean test( T item )
-            {
-                return item != null;
-            }
-        };
-    }
-
-    public static <FROM, TO> Predicate<FROM> translate( final Function<FROM, TO> function,
-                                                        final Predicate<? super TO> specification
-    )
-    {
-        return new Predicate<FROM>()
-        {
-            @Override
-            public boolean test( FROM item )
-            {
-                return specification.test( function.apply( item ) );
-            }
-        };
-    }
-
-    /**
-     * AND Specification.
-     */
-    public static class AndSpecification<T>
-        implements Predicate<T>
-    {
-        private final Iterable<Predicate<T>> specifications;
-
-        private AndSpecification( Iterable<Predicate<T>> specifications )
-        {
-            this.specifications = specifications;
-        }
-
-        @Override
-        public boolean test( T instance )
-        {
-            for( Predicate<T> specification : specifications )
-            {
-                if( !specification.test( instance ) )
-                {
-                    return false;
-                }
-            }
-
-            return true;
-        }
-
-        @SafeVarargs
-        public final AndSpecification<T> and( Predicate<T>... specifications )
-        {
-            Iterable<Predicate<T>> iterable = Iterables.iterable( specifications );
-            Iterable<Predicate<T>> flatten = Iterables.flatten( this.specifications, iterable );
-            return Specifications.and( flatten );
-        }
-
-        @SafeVarargs
-        public final OrSpecification<T> or( Predicate<T>... specifications )
-        {
-            return Specifications.or( Iterables.prepend( this, Iterables.iterable( specifications ) ) );
-        }
-    }
-
-    /**
-     * OR Specification.
-     */
-    public static class OrSpecification<T>
-        implements Predicate<T>
-    {
-        private final Iterable<Predicate<T>> specifications;
-
-        private OrSpecification( Iterable<Predicate<T>> specifications )
-        {
-            this.specifications = specifications;
-        }
-
-        @Override
-        public boolean test( T instance )
-        {
-            for( Predicate<T> specification : specifications )
-            {
-                if( specification.test( instance ) )
-                {
-                    return true;
-                }
-            }
-
-            return false;
-        }
-
-        @SafeVarargs
-        public final AndSpecification<T> and( Predicate<T>... specifications )
-        {
-            return Specifications.and( Iterables.prepend( this, Iterables.iterable( specifications ) ) );
-        }
-
-        @SafeVarargs
-        public final OrSpecification<T> or( Predicate<T>... specifications )
-        {
-            Iterable<Predicate<T>> iterable = Iterables.iterable( specifications );
-            Iterable<Predicate<T>> flatten = Iterables.flatten( this.specifications, iterable );
-            return Specifications.or( flatten );
-        }
-    }
-
-    private Specifications()
-    {
-    }
-}

http://git-wip-us.apache.org/repos/asf/zest-java/blob/bd6fbad9/core/functional/src/test/java/org/apache/zest/functional/FunctionsTest.java
----------------------------------------------------------------------
diff --git a/core/functional/src/test/java/org/apache/zest/functional/FunctionsTest.java b/core/functional/src/test/java/org/apache/zest/functional/FunctionsTest.java
deleted file mode 100644
index bb2428c..0000000
--- a/core/functional/src/test/java/org/apache/zest/functional/FunctionsTest.java
+++ /dev/null
@@ -1,144 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.zest.functional;
-
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.function.Function;
-import org.junit.Test;
-
-import static org.hamcrest.CoreMatchers.equalTo;
-import static org.junit.Assert.assertThat;
-import static org.apache.zest.functional.ForEach.forEach;
-import static org.apache.zest.functional.Functions.compose;
-import static org.apache.zest.functional.Functions.count;
-import static org.apache.zest.functional.Functions.indexOf;
-import static org.apache.zest.functional.Functions.intSum;
-import static org.apache.zest.functional.Functions.longSum;
-import static org.apache.zest.functional.Iterables.iterable;
-import static org.apache.zest.functional.Iterables.last;
-import static org.apache.zest.functional.Iterables.map;
-import static org.apache.zest.functional.Specifications.in;
-
-/**
- * Test of utility functions
- */
-public class FunctionsTest
-{
-    Function<Object, String> stringifier = new Function<Object, String>()
-    {
-        @Override
-        public String apply( Object s )
-        {
-            return s.toString();
-        }
-    };
-
-    Function<String, Integer> length = new Function<String, Integer>()
-    {
-        @Override
-        public Integer apply( String s )
-        {
-            return s.length();
-        }
-    };
-
-    @Test
-    public void testCompose()
-    {
-        assertThat( Functions.<Object, String, Integer>compose()
-                        .apply( length, stringifier )
-                        .apply( 12345L ), equalTo( 5 ) );
-        assertThat( compose( length, stringifier ).apply( 12345L ), equalTo( 5 ) );
-    }
-
-    @Test
-    public void testFromMap()
-    {
-        Map<String, String> map = new HashMap<String, String>();
-        map.put( "A", "1" );
-        map.put( "B", "2" );
-        map.put( "C", "3" );
-        assertThat( Iterables.toList( Iterables.filter( Specifications.notNull(), Iterables.map( Functions.fromMap( map ), Iterables
-            .iterable( "A", "B", "D" ) ) ) ).toString(), equalTo( "[1, 2]" ) );
-    }
-
-    @Test
-    public void testWithDefault()
-    {
-        assertThat( Iterables.toList( Iterables.map( Functions.withDefault( "DEFAULT" ), Iterables.iterable( "123", null, "456" ) ) )
-                        .toString(), equalTo( "[123, DEFAULT, 456]" ) );
-    }
-
-    @Test
-    public void testLongSum()
-    {
-        assertThat( last( map( longSum(), iterable( 1, 2L, 3F, 4D ) ) ), equalTo( 10L ) );
-    }
-
-    @Test
-    public void testLongSum2()
-    {
-        assertThat( forEach( iterable( 1, 2, 3, 4 ) ).map( longSum() ).last(), equalTo( 10L ) );
-    }
-
-    @Test
-    public void testIntSum()
-    {
-        assertThat( last( map( intSum(), iterable( 1, 2L, 3F, 4D ) ) ), equalTo( 10 ) );
-    }
-
-    @Test
-    public void testCount()
-    {
-        assertThat( last( map( count( in( "X" ) ), iterable( "X", "Y", "X", "X", "Y" ) ) ), equalTo( 3 ) );
-    }
-
-    @Test
-    public void testIndexOf()
-    {
-        assertThat( last( map( indexOf( in( "D" ) ), iterable( "A", "B", "C", "D", "D" ) ) ), equalTo( 3 ) );
-    }
-
-    @Test
-    public void testIndexOf2()
-    {
-        assertThat( indexOf( "D", iterable( "A", "B", "C", "D", "D" ) ), equalTo( 3 ) );
-    }
-
-    @Test
-    public void testComparator()
-    {
-        Comparator<Integer> comparator = Functions.comparator( new Function<Integer, Comparable>()
-        {
-            @Override
-            public Comparable apply( Integer integer )
-            {
-                return integer.toString();
-            }
-        } );
-        Iterable<Integer> iterable = Iterables.iterable( 1, 5, 3, 6, 8 );
-        List<Integer> integers = Iterables.toList( iterable );
-        Collections.sort( integers, comparator );
-        assertThat( integers.toString(), equalTo( "[1, 3, 5, 6, 8]" ) );
-    }
-}

http://git-wip-us.apache.org/repos/asf/zest-java/blob/bd6fbad9/core/functional/src/test/java/org/apache/zest/functional/IterablesTest.java
----------------------------------------------------------------------
diff --git a/core/functional/src/test/java/org/apache/zest/functional/IterablesTest.java b/core/functional/src/test/java/org/apache/zest/functional/IterablesTest.java
index 7ff5bab..f8512e9 100644
--- a/core/functional/src/test/java/org/apache/zest/functional/IterablesTest.java
+++ b/core/functional/src/test/java/org/apache/zest/functional/IterablesTest.java
@@ -19,7 +19,6 @@ import java.util.Comparator;
 import java.util.Enumeration;
 import java.util.List;
 import java.util.function.Function;
-import java.util.function.Predicate;
 import org.hamcrest.CoreMatchers;
 import org.junit.Test;
 
@@ -38,19 +37,6 @@ public class IterablesTest
     private Iterable<Integer> numberIntegers = Arrays.asList( 1, 2, 3 );
 
     @Test
-    public void testConstant()
-    {
-        String str = "";
-
-        for( String string : Iterables.limit( 3, Iterables.constant( "123" ) ) )
-        {
-            str += string;
-        }
-
-        assertThat( str, CoreMatchers.equalTo( "123123123" ) );
-    }
-
-    @Test
     public void testUnique()
     {
         String str = "";
@@ -77,12 +63,6 @@ public class IterablesTest
     }
 
     @Test
-    public void testFilter()
-    {
-        assertThat( Iterables.first( Iterables.filter( Specifications.in( "2" ), numbers ) ), equalTo( "2" ) );
-    }
-
-    @Test
     public void testFirst()
     {
         assertThat( Iterables.first( numbers ), equalTo( "1" ) );
@@ -128,20 +108,6 @@ public class IterablesTest
     }
 
     @Test
-    public void testMatchesAny()
-    {
-        assertThat( Iterables.matchesAny( Specifications.in( "2" ), numbers ), equalTo( true ) );
-        assertThat( Iterables.matchesAny( Specifications.in( "4" ), numbers ), equalTo( false ) );
-    }
-
-    @Test
-    public void testMatchesAll()
-    {
-        assertThat( Iterables.matchesAll( Specifications.in( "1", "2", "3" ), numbers ), equalTo( true ) );
-        assertThat( Iterables.matchesAll( Specifications.in( "2", "3", "4" ), numbers ), equalTo( false ) );
-    }
-
-    @Test
     public void testFlatten()
     {
         assertThat( Iterables.toList( Iterables.flatten( numbers, numbers ) ).toString(),
@@ -218,62 +184,6 @@ public class IterablesTest
     }
 
     @Test
-    public void testDebug()
-    {
-        assertThat( Iterables.first( Iterables.debug( "Filtered number:{0}",
-                                                      Iterables.filter( Specifications.in( "2" ),
-                                                                        Iterables.debug( "Number:{0}", numbers ) ) ) ),
-                    equalTo( "2" ) );
-    }
-
-    @Test
-    public void testDebugWithFunctions()
-    {
-        Function<String, String> fun = new Function<String, String>()
-        {
-
-            @Override
-            public String apply( String s )
-            {
-                return s + ":" + s.length();
-            }
-
-        };
-        assertThat( Iterables.first( Iterables.debug( "Filtered number:{0}",
-                                                      Iterables.filter( Specifications.in( "2" ),
-                                                                        Iterables.debug( "Number:{0}", numbers, fun ) ) ) ),
-                    equalTo( "2" ) );
-    }
-
-    @Test
-    public void testCache()
-    {
-        final int[] count = new int[ 1 ];
-
-        Iterable<String> b = Iterables.cache( Iterables.filter( Specifications.and( new Predicate<String>()
-        {
-
-            @Override
-            public boolean test( String item )
-            {
-                count[ 0] = count[ 0] + 1;
-                return true;
-            }
-
-        }, Specifications.in( "B" ) ), Iterables.iterable( "A", "B", "C" ) ) );
-
-        assertThat( count[ 0], equalTo( 0 ) );
-
-        Iterables.toList( b );
-
-        assertThat( count[ 0], equalTo( 3 ) );
-
-        Iterables.toList( b );
-
-        assertThat( count[ 0], equalTo( 3 ) );
-    }
-
-    @Test
     public void testSort()
     {
         assertThat( Iterables.sort( Iterables.reverse( numberLongs ) ).toString(), equalTo( "[1, 2, 3]" ) );

http://git-wip-us.apache.org/repos/asf/zest-java/blob/bd6fbad9/core/functional/src/test/java/org/apache/zest/functional/SpecificationsTest.java
----------------------------------------------------------------------
diff --git a/core/functional/src/test/java/org/apache/zest/functional/SpecificationsTest.java b/core/functional/src/test/java/org/apache/zest/functional/SpecificationsTest.java
deleted file mode 100644
index f5ce2c0..0000000
--- a/core/functional/src/test/java/org/apache/zest/functional/SpecificationsTest.java
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
- * Copyright (c) 2010, Rickard Öberg. All Rights Reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- */
-
-package org.apache.zest.functional;
-
-import java.util.function.Function;
-import java.util.function.Predicate;
-import org.junit.Assert;
-import org.junit.Test;
-
-import static org.hamcrest.CoreMatchers.equalTo;
-
-/**
- * JAVADOC
- */
-public class SpecificationsTest
-{
-    @Test
-    public void testTRUE()
-    {
-        Assert.assertThat( Specifications.<Object>TRUE().test( new Object() ), equalTo( true ) );
-    }
-
-    @Test
-    public void testNot()
-    {
-        Assert.assertThat( Specifications.not( Specifications.<Object>TRUE() ).test( new Object() ), equalTo( false ) );
-    }
-
-    @Test
-    public void testAnd()
-    {
-        Predicate<Object> trueSpec = Specifications.<Object>TRUE();
-        Predicate<Object> falseSpec = Specifications.not( Specifications.<Object>TRUE() );
-
-        Assert.assertThat( Specifications.and( falseSpec, falseSpec ).test( new Object() ), equalTo( false ) );
-        Assert.assertThat( Specifications.and( trueSpec, falseSpec ).test( new Object() ), equalTo( false ) );
-        Assert.assertThat( Specifications.and( falseSpec, trueSpec ).test( new Object() ), equalTo( false ) );
-        Assert.assertThat( Specifications.and( trueSpec, trueSpec ).test( new Object() ), equalTo( true ) );
-    }
-
-    @Test
-    public void testOr()
-    {
-        Predicate<Object> trueSpec = Specifications.<Object>TRUE();
-        Predicate<Object> falseSpec = Specifications.not( Specifications.<Object>TRUE() );
-
-        Assert.assertThat( Specifications.or( falseSpec, falseSpec ).test( new Object() ), equalTo( false ) );
-        Assert.assertThat( Specifications.or( trueSpec, falseSpec ).test( new Object() ), equalTo( true ) );
-        Assert.assertThat( Specifications.or( falseSpec, trueSpec ).test( new Object() ), equalTo( true ) );
-        Assert.assertThat( Specifications.or( trueSpec, trueSpec ).test( new Object() ), equalTo( true ) );
-    }
-
-    @Test
-    public void testIn()
-    {
-        Assert.assertThat( Specifications.in( "1", "2", "3" ).test( "2" ), equalTo( true ) );
-        Assert.assertThat( Specifications.in( "1", "2", "3" ).test( "4" ), equalTo( false ) );
-    }
-
-    @Test
-    public void testTranslate()
-    {
-        Function<Object, String> stringifier = new Function<Object, String>()
-        {
-            @Override
-            public String apply( Object s )
-            {
-                return s.toString();
-            }
-        };
-
-        Assert.assertTrue( Specifications.translate( stringifier, Specifications.in( "3" ) ).test( 3L ) );
-    }
-}

http://git-wip-us.apache.org/repos/asf/zest-java/blob/bd6fbad9/core/functional/src/test/java/org/apache/zest/functional/docsupport/FunctionalDocs.java
----------------------------------------------------------------------
diff --git a/core/functional/src/test/java/org/apache/zest/functional/docsupport/FunctionalDocs.java b/core/functional/src/test/java/org/apache/zest/functional/docsupport/FunctionalDocs.java
index 12a218d..15e9a60 100644
--- a/core/functional/src/test/java/org/apache/zest/functional/docsupport/FunctionalDocs.java
+++ b/core/functional/src/test/java/org/apache/zest/functional/docsupport/FunctionalDocs.java
@@ -19,11 +19,7 @@
 package org.apache.zest.functional.docsupport;
 
 import java.util.ArrayList;
-
-// START SNIPPET: func2
-import static org.apache.zest.functional.ForEach.forEach;
-import static org.apache.zest.functional.Functions.longSum;
-// END SNIPPET: func2
+import java.util.stream.StreamSupport;
 
 public class FunctionalDocs
 {
@@ -45,9 +41,9 @@ public class FunctionalDocs
         }
         {
 // START SNIPPET: func2
-            Iterable<Number> data = new ArrayList<Number>();
-            Long sum = forEach( data ).map( longSum() ).last();
-            System.out.println( "The sum is " + sum );
+            Iterable<Long> data = new ArrayList<>();
+            Long total = StreamSupport.stream( data.spliterator(), true ).reduce( 0L, ( sum, n ) -> sum + n );
+            System.out.println( "The sum is " + total );
 
 // END SNIPPET: func2
         }

http://git-wip-us.apache.org/repos/asf/zest-java/blob/bd6fbad9/core/runtime/src/main/java/org/apache/zest/runtime/activation/ActivationDelegate.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/zest/runtime/activation/ActivationDelegate.java b/core/runtime/src/main/java/org/apache/zest/runtime/activation/ActivationDelegate.java
index e7406b2..b69d9a7 100644
--- a/core/runtime/src/main/java/org/apache/zest/runtime/activation/ActivationDelegate.java
+++ b/core/runtime/src/main/java/org/apache/zest/runtime/activation/ActivationDelegate.java
@@ -18,6 +18,7 @@ import java.util.Collections;
 import java.util.LinkedHashSet;
 import java.util.LinkedList;
 import java.util.Set;
+import java.util.stream.Stream;
 import org.apache.zest.api.activation.Activation;
 import org.apache.zest.api.activation.ActivationEvent;
 import org.apache.zest.api.activation.ActivationEventListener;
@@ -156,7 +157,7 @@ public final class ActivationDelegate
     public void passivate()
         throws PassivationException
     {
-        passivate( (Runnable) null );
+        passivate( null );
     }
 
     @SuppressWarnings( "unchecked" )
@@ -221,14 +222,7 @@ public final class ActivationDelegate
             }
             catch( Exception ex )
             {
-                if( ex instanceof PassivationException )
-                {
-                    exceptions.addAll( ( (PassivationException) ex ).causes() );
-                }
-                else
-                {
-                    exceptions.add( ex );
-                }
+                exceptions.add( ex );
             }
         }
 
@@ -340,7 +334,7 @@ public final class ActivationDelegate
         }
 
         @Override
-        public Iterable<Class<?>> types()
+        public Stream<Class<?>> types()
         {
             return reference.types();
         }

http://git-wip-us.apache.org/repos/asf/zest-java/blob/bd6fbad9/core/runtime/src/main/java/org/apache/zest/runtime/association/AssociationModel.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/zest/runtime/association/AssociationModel.java b/core/runtime/src/main/java/org/apache/zest/runtime/association/AssociationModel.java
index 323b5aa..3558d6e 100644
--- a/core/runtime/src/main/java/org/apache/zest/runtime/association/AssociationModel.java
+++ b/core/runtime/src/main/java/org/apache/zest/runtime/association/AssociationModel.java
@@ -21,12 +21,12 @@ import java.lang.reflect.Method;
 import java.lang.reflect.Type;
 import java.lang.reflect.TypeVariable;
 import java.util.List;
+import java.util.stream.Stream;
 import org.apache.zest.api.association.Association;
 import org.apache.zest.api.association.AssociationDescriptor;
 import org.apache.zest.api.association.GenericAssociationInfo;
 import org.apache.zest.api.common.MetaInfo;
 import org.apache.zest.api.common.QualifiedName;
-import org.apache.zest.api.composite.Composite;
 import org.apache.zest.api.constraint.ConstraintViolation;
 import org.apache.zest.api.constraint.ConstraintViolationException;
 import org.apache.zest.api.entity.Aggregated;
@@ -40,9 +40,6 @@ import org.apache.zest.runtime.composite.ValueConstraintsInstance;
 import org.apache.zest.runtime.model.Binder;
 import org.apache.zest.runtime.model.Resolution;
 
-import static org.apache.zest.functional.Iterables.empty;
-import static org.apache.zest.functional.Iterables.first;
-
 /**
  * Model for an Association.
  *
@@ -149,7 +146,7 @@ public final class AssociationModel
             List<ConstraintViolation> violations = constraints.checkConstraints( value );
             if( !violations.isEmpty() )
             {
-                Iterable<Class<?>> empty = empty();
+                Stream<Class<?>> empty = Stream.empty();
                 throw new ConstraintViolationException( "", empty, (Member) accessor, violations );
             }
         }
@@ -163,7 +160,8 @@ public final class AssociationModel
             List<ConstraintViolation> violations = associationConstraints.checkConstraints( association );
             if( !violations.isEmpty() )
             {
-                throw new ConstraintViolationException( (Composite) association.get(), (Member) accessor, violations );
+                Stream<Class<?>> empty = Stream.empty();
+                throw new ConstraintViolationException( "", empty, (Member) accessor, violations );
             }
         }
     }
@@ -203,7 +201,7 @@ public final class AssociationModel
         if( type instanceof TypeVariable )
         {
 
-            Class mainType = first( resolution.model().types() );
+            Class mainType = resolution.model().types().findFirst().orElse( null );
             type = Classes.resolveTypeVariable( (TypeVariable) type, ( (Member) accessor ).getDeclaringClass(), mainType );
         }
     }

http://git-wip-us.apache.org/repos/asf/zest-java/blob/bd6fbad9/core/runtime/src/main/java/org/apache/zest/runtime/association/AssociationsModel.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/zest/runtime/association/AssociationsModel.java b/core/runtime/src/main/java/org/apache/zest/runtime/association/AssociationsModel.java
index a0f3d67..2932d2f 100644
--- a/core/runtime/src/main/java/org/apache/zest/runtime/association/AssociationsModel.java
+++ b/core/runtime/src/main/java/org/apache/zest/runtime/association/AssociationsModel.java
@@ -21,6 +21,7 @@ import java.lang.reflect.AccessibleObject;
 import java.lang.reflect.Member;
 import java.util.LinkedHashMap;
 import java.util.Map;
+import java.util.stream.Stream;
 import org.apache.zest.api.association.Association;
 import org.apache.zest.api.association.AssociationDescriptor;
 import org.apache.zest.api.association.AssociationStateHolder;
@@ -40,9 +41,9 @@ public final class AssociationsModel
     {
     }
 
-    public Iterable<AssociationModel> associations()
+    public Stream<AssociationModel> associations()
     {
-        return mapAccessorAssociationModel.values();
+        return mapAccessorAssociationModel.values().stream();
     }
 
     public void addAssociation( AssociationModel associationModel )

http://git-wip-us.apache.org/repos/asf/zest-java/blob/bd6fbad9/core/runtime/src/main/java/org/apache/zest/runtime/association/ManyAssociationModel.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/zest/runtime/association/ManyAssociationModel.java b/core/runtime/src/main/java/org/apache/zest/runtime/association/ManyAssociationModel.java
index 73fa70c..57c6790 100644
--- a/core/runtime/src/main/java/org/apache/zest/runtime/association/ManyAssociationModel.java
+++ b/core/runtime/src/main/java/org/apache/zest/runtime/association/ManyAssociationModel.java
@@ -25,6 +25,7 @@ import java.lang.reflect.Type;
 import java.lang.reflect.TypeVariable;
 import java.util.List;
 import java.util.function.BiFunction;
+import java.util.stream.Stream;
 import org.apache.zest.api.association.AssociationDescriptor;
 import org.apache.zest.api.association.GenericAssociationInfo;
 import org.apache.zest.api.association.ManyAssociation;
@@ -161,7 +162,7 @@ public final class ManyAssociationModel
             List<ConstraintViolation> violations = constraints.checkConstraints( composite );
             if( !violations.isEmpty() )
             {
-                Iterable<Class<?>> empty = empty();
+                Stream<Class<?>> empty = Stream.empty();
                 throw new ConstraintViolationException( "", empty, (Member) accessor, violations );
             }
         }
@@ -175,7 +176,7 @@ public final class ManyAssociationModel
             List<ConstraintViolation> violations = associationConstraints.checkConstraints( manyAssociation );
             if( !violations.isEmpty() )
             {
-                Iterable<Class<?>> empty = empty();
+                Stream<Class<?>> empty = Stream.empty();
                 throw new ConstraintViolationException( "", empty, (Member) accessor, violations );
             }
         }
@@ -222,7 +223,7 @@ public final class ManyAssociationModel
 
         if( type instanceof TypeVariable )
         {
-            Class mainType = first( resolution.model().types() );
+            Class mainType = resolution.model().types().findFirst().orElse( null );
             type = Classes.resolveTypeVariable( (TypeVariable) type, ( (Member) accessor ).getDeclaringClass(), mainType );
         }
     }

http://git-wip-us.apache.org/repos/asf/zest-java/blob/bd6fbad9/core/runtime/src/main/java/org/apache/zest/runtime/association/ManyAssociationsModel.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/zest/runtime/association/ManyAssociationsModel.java b/core/runtime/src/main/java/org/apache/zest/runtime/association/ManyAssociationsModel.java
index 220d3ec..11d188d 100644
--- a/core/runtime/src/main/java/org/apache/zest/runtime/association/ManyAssociationsModel.java
+++ b/core/runtime/src/main/java/org/apache/zest/runtime/association/ManyAssociationsModel.java
@@ -21,6 +21,7 @@ import java.lang.reflect.AccessibleObject;
 import java.lang.reflect.Member;
 import java.util.LinkedHashMap;
 import java.util.Map;
+import java.util.stream.Stream;
 import org.apache.zest.api.association.AssociationDescriptor;
 import org.apache.zest.api.association.ManyAssociation;
 import org.apache.zest.api.common.QualifiedName;
@@ -42,9 +43,9 @@ public final class ManyAssociationsModel
     {
     }
 
-    public Iterable<ManyAssociationModel> manyAssociations()
+    public Stream<ManyAssociationModel> manyAssociations()
     {
-        return mapAccessorAssociationModel.values();
+        return mapAccessorAssociationModel.values().stream();
     }
 
     public void addManyAssociation( ManyAssociationModel model )

http://git-wip-us.apache.org/repos/asf/zest-java/blob/bd6fbad9/core/runtime/src/main/java/org/apache/zest/runtime/association/NamedAssociationModel.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/zest/runtime/association/NamedAssociationModel.java b/core/runtime/src/main/java/org/apache/zest/runtime/association/NamedAssociationModel.java
index 82a7af5..0b0f340 100644
--- a/core/runtime/src/main/java/org/apache/zest/runtime/association/NamedAssociationModel.java
+++ b/core/runtime/src/main/java/org/apache/zest/runtime/association/NamedAssociationModel.java
@@ -26,6 +26,7 @@ import java.lang.reflect.Type;
 import java.lang.reflect.TypeVariable;
 import java.util.List;
 import java.util.function.BiFunction;
+import java.util.stream.Stream;
 import org.apache.zest.api.association.AssociationDescriptor;
 import org.apache.zest.api.association.GenericAssociationInfo;
 import org.apache.zest.api.association.NamedAssociation;
@@ -162,7 +163,7 @@ public final class NamedAssociationModel
             List<ConstraintViolation> violations = constraints.checkConstraints( composite );
             if( !violations.isEmpty() )
             {
-                Iterable<Class<?>> empty = empty();
+                Stream<Class<?>> empty = Stream.empty();
                 throw new ConstraintViolationException( "", empty, (Member) accessor, violations );
             }
         }
@@ -176,7 +177,7 @@ public final class NamedAssociationModel
             List<ConstraintViolation> violations = associationConstraints.checkConstraints( association );
             if( !violations.isEmpty() )
             {
-                Iterable<Class<?>> empty = empty();
+                Stream<Class<?>> empty = Stream.empty();
                 throw new ConstraintViolationException( "", empty, (Member) accessor, violations );
             }
         }
@@ -223,7 +224,7 @@ public final class NamedAssociationModel
 
         if( type instanceof TypeVariable )
         {
-            Class mainType = first( resolution.model().types() );
+            Class mainType = resolution.model().types().findFirst().orElse( null );
             type = Classes.resolveTypeVariable( (TypeVariable) type, ( (Member) accessor ).getDeclaringClass(), mainType );
         }
     }

http://git-wip-us.apache.org/repos/asf/zest-java/blob/bd6fbad9/core/runtime/src/main/java/org/apache/zest/runtime/association/NamedAssociationsModel.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/zest/runtime/association/NamedAssociationsModel.java b/core/runtime/src/main/java/org/apache/zest/runtime/association/NamedAssociationsModel.java
index 87722b0..ad536d1 100644
--- a/core/runtime/src/main/java/org/apache/zest/runtime/association/NamedAssociationsModel.java
+++ b/core/runtime/src/main/java/org/apache/zest/runtime/association/NamedAssociationsModel.java
@@ -22,6 +22,7 @@ import java.lang.reflect.AccessibleObject;
 import java.lang.reflect.Member;
 import java.util.LinkedHashMap;
 import java.util.Map;
+import java.util.stream.Stream;
 import org.apache.zest.api.association.AssociationDescriptor;
 import org.apache.zest.api.association.NamedAssociation;
 import org.apache.zest.api.common.QualifiedName;
@@ -43,9 +44,9 @@ public final class NamedAssociationsModel
     {
     }
 
-    public Iterable<NamedAssociationModel> namedAssociations()
+    public Stream<NamedAssociationModel> namedAssociations()
     {
-        return mapAccessorAssociationModel.values();
+        return mapAccessorAssociationModel.values().stream();
     }
 
     public void addNamedAssociation( NamedAssociationModel model )