You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by ah...@apache.org on 2018/04/12 11:25:24 UTC
[isis] 01/04: ISIS-1932 Internal API _Collections: add
'unmodifiable collectors'
This is an automated email from the ASF dual-hosted git repository.
ahuber pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/isis.git
commit 0ecd43cf7400520fddfeba61ae8249608a0b07dd
Author: Andi Huber <ah...@apache.org>
AuthorDate: Thu Apr 12 08:29:19 2018 +0200
ISIS-1932 Internal API _Collections: add 'unmodifiable collectors'
---
.../applib/internal/collections/_Collections.java | 192 +++++++++++++++++++++
.../collections/_Collections_Collector.java | 80 +++++++++
.../collections/_Collections_SortedSetOfList.java | 149 ++++++++++++++++
.../MethodIncompatibilityWorkaround.java | 160 +----------------
.../core/metamodel/services/ServicesInjector.java | 15 +-
.../core/metamodel/specloader/CollectionUtils.java | 52 ------
6 files changed, 431 insertions(+), 217 deletions(-)
diff --git a/core/applib/src/main/java/org/apache/isis/applib/internal/collections/_Collections.java b/core/applib/src/main/java/org/apache/isis/applib/internal/collections/_Collections.java
new file mode 100644
index 0000000..96c59e6
--- /dev/null
+++ b/core/applib/src/main/java/org/apache/isis/applib/internal/collections/_Collections.java
@@ -0,0 +1,192 @@
+/*
+ * 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.isis.applib.internal.collections;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.HashSet;
+import java.util.LinkedHashSet;
+import java.util.List;
+import java.util.Objects;
+import java.util.Set;
+import java.util.SortedSet;
+import java.util.TreeSet;
+import java.util.stream.Collector;
+import java.util.stream.Collectors;
+
+import javax.annotation.Nullable;
+
+/**
+ * <h1>- internal use only -</h1>
+ * <p>
+ * Common Collection creation and adapting idioms.
+ * </p>
+ * <p>
+ * <b>WARNING</b>: Do <b>NOT</b> use any of the classes provided by this package! <br/>
+ * These may be changed or removed without notice!
+ * </p>
+ *
+ * @since 2.0.0
+ */
+public class _Collections {
+
+ // -- COLLECTION UNMODIFIABLE ADAPTERS (FOR LIST)
+
+ /**
+ * Adapts the {@code list} as unmodifiable collection.
+ * Same as {@link Collections#unmodifiableCollection(List)}.
+ *
+ * @param list
+ * @return null if {@code list} is null
+ */
+ public static <T> Collection<T> asUnmodifiableCollection(@Nullable final List<T> list) {
+ if(list==null) {
+ return null;
+ }
+ return Collections.unmodifiableCollection(list);
+ }
+
+ /**
+ * Adapts the {@code list} as unmodifiable list.
+ * Same as {@link Collections#unmodifiableList(List)}.
+ *
+ * @param list
+ * @return
+ */
+ public static <T> List<T> asUnmodifiableList(@Nullable final List<T> list) {
+ if(list==null) {
+ return null;
+ }
+ return Collections.unmodifiableList(list);
+ }
+
+ /**
+ * Preserves order, adapts the {@code list} as Set.<br/><br/>
+ *
+ * Any duplicate elements of the list will not be added to the set.
+ * An element e1 is a duplicate of e2 if {@code e1.equals(e2) == true}.
+ *
+ * @param list
+ * @return null if {@code list} is null
+ */
+ public static <T> Set<T> asUnmodifiableSet(@Nullable final List<T> list) {
+ if(list==null) {
+ return null;
+ }
+ return Collections.unmodifiableSet(
+ (Set<T>)
+ list.stream()
+ .collect(Collectors.toCollection(LinkedHashSet::new)));
+ }
+
+ /**
+ * Preserves order, adapts the {@code list} as SortedSet.<br/><br/>
+ *
+ * Any duplicate elements of the list will not be added to the set.
+ * An element e1 is a duplicate of e2 if {@code e1.equals(e2) == true}.
+ *
+ * @param list
+ * @return null if {@code list} is null
+ */
+ public static <T> SortedSet<T> asUnmodifiableSortedSet(@Nullable final List<T> list) {
+ if(list==null) {
+ return null;
+ }
+ return _Collections_SortedSetOfList.of(list);
+ }
+
+ // -- STREAM TO UMODIFIABLE COLLECTION COLLECTORS
+
+ /**
+ * @return a collector that collects elements of a stream into an unmodifiable List
+ */
+ public static <T> Collector<T, List<T>, List<T>> toUnmodifiableList() {
+ return new _Collections_Collector<>(ArrayList::new, Collections::unmodifiableList);
+ }
+
+ /**
+ * @return a collector that collects elements of a stream into an unmodifiable Set
+ */
+ public static <T> Collector<T, Set<T>, Set<T>> toUnmodifiableSet() {
+ return new _Collections_Collector<>(HashSet::new, Collections::unmodifiableSet);
+ }
+
+ /**
+ * @return a collector that collects elements of a stream into an unmodifiable SortedSet
+ */
+ public static <T> Collector<T, SortedSet<T>, SortedSet<T>> toUnmodifiableSortedSet() {
+ return new _Collections_Collector<>(TreeSet::new, Collections::unmodifiableSortedSet);
+ }
+
+ /**
+ * @return a collector that collects elements of a stream into an unmodifiable Collection
+ */
+ public static <T> Collector<T, Collection<T>, Collection<T>> toUnmodifiableCollection() {
+ return new _Collections_Collector<>(ArrayList::new, Collections::unmodifiableCollection);
+ }
+
+ /**
+ * @return a collector that collects elements of a stream into an unmodifiable SortedSet
+ */
+ public static <T> Collector<T, SortedSet<T>, SortedSet<T>> toUnmodifiableSortedSet(
+ @Nullable Comparator<T> comparator) {
+
+ if(comparator==null) {
+ return toUnmodifiableSortedSet();
+ }
+ return new _Collections_Collector<>(()->new TreeSet<>(comparator), Collections::unmodifiableSortedSet);
+ }
+
+ /**
+ * @return a collector that collects elements of a stream into an unmodifiable
+ * List, Set, SortedSet or Collection.
+ * @throws IllegalArgumentException if the {@link typeOfCollection} is not one of
+ * List, Set, SortedSet or Collection.
+ */
+ public static <T> Collector<T, ?, ? extends Collection<T>> toUnmodifiableOfType(Class<?> typeOfCollection) {
+
+ Objects.requireNonNull(typeOfCollection);
+
+ if(SortedSet.class.equals(typeOfCollection)) {
+ return toUnmodifiableSortedSet();
+ }
+
+ if(Set.class.equals(typeOfCollection)) {
+ return toUnmodifiableSet();
+ }
+
+ if(List.class.equals(typeOfCollection)) {
+ return toUnmodifiableList();
+ }
+
+ if(Collection.class.equals(typeOfCollection)) {
+ return toUnmodifiableCollection();
+ }
+
+ throw new IllegalArgumentException(
+ String.format("Can not collect into %s. Only List, Set, SortedSet and Collection are supported.",
+ typeOfCollection.getClass().getName()));
+ }
+
+ // --
+
+}
diff --git a/core/applib/src/main/java/org/apache/isis/applib/internal/collections/_Collections_Collector.java b/core/applib/src/main/java/org/apache/isis/applib/internal/collections/_Collections_Collector.java
new file mode 100644
index 0000000..10a8b7a
--- /dev/null
+++ b/core/applib/src/main/java/org/apache/isis/applib/internal/collections/_Collections_Collector.java
@@ -0,0 +1,80 @@
+/*
+ * 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.isis.applib.internal.collections;
+
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Objects;
+import java.util.Set;
+import java.util.function.BiConsumer;
+import java.util.function.BinaryOperator;
+import java.util.function.Function;
+import java.util.function.Supplier;
+import java.util.stream.Collector;
+
+/**
+ *
+ * package private mixin for utility class {@link _Collections}
+ *
+ * Collector for Collections.
+ *
+ */
+class _Collections_Collector<T, C extends Collection<T>> implements Collector<T, C, C> {
+
+ private final Supplier<C> supplier;
+ private final Function<C, C> finisher;
+
+ _Collections_Collector(Supplier<C> supplier, Function<C, C> finisher) {
+ this.supplier = Objects.requireNonNull(supplier);
+ this.finisher = Objects.requireNonNull(finisher);
+ }
+
+ @Override
+ public Supplier<C> supplier() {
+ return supplier;
+ }
+
+ @Override
+ public BiConsumer<C, T> accumulator() {
+ return Collection::add;
+ }
+
+ @Override
+ public BinaryOperator<C> combiner() {
+ return (left, right) -> { left.addAll(right); return left; };
+ }
+
+ @Override
+ public Function<C, C> finisher() {
+ return finisher;
+ }
+
+ @Override
+ public Set<Characteristics> characteristics() {
+ return Collections.emptySet();
+ }
+
+
+}
+
+
+
+
+
diff --git a/core/applib/src/main/java/org/apache/isis/applib/internal/collections/_Collections_SortedSetOfList.java b/core/applib/src/main/java/org/apache/isis/applib/internal/collections/_Collections_SortedSetOfList.java
new file mode 100644
index 0000000..add7d8a
--- /dev/null
+++ b/core/applib/src/main/java/org/apache/isis/applib/internal/collections/_Collections_SortedSetOfList.java
@@ -0,0 +1,149 @@
+/*
+ * 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.isis.applib.internal.collections;
+
+import java.util.Collection;
+import java.util.Comparator;
+import java.util.Iterator;
+import java.util.List;
+import java.util.NoSuchElementException;
+import java.util.SortedSet;
+
+/**
+ *
+ * package private mixin for utility class {@link _Collections}
+ *
+ */
+class _Collections_SortedSetOfList<T> implements SortedSet<T> {
+
+ private final static String JUST_AN_ADAPTER =
+ "this set is just an adapter, it has no information about the intended comparator";
+
+ static <T> _Collections_SortedSetOfList<T> of(List<T> list){
+ return new _Collections_SortedSetOfList<>(list);
+ }
+
+ private final List<T> list;
+
+ private _Collections_SortedSetOfList(List<T> list) {
+ this.list = list;
+ }
+
+ @Override
+ public int size() {
+ return list.size();
+ }
+
+ @Override
+ public boolean isEmpty() {
+ return list.isEmpty();
+ }
+
+ @Override
+ public boolean contains(Object o) {
+ throw new UnsupportedOperationException(JUST_AN_ADAPTER);
+ }
+
+ @Override
+ public Iterator<T> iterator() {
+ return list.iterator();
+ }
+
+ @Override
+ public Object[] toArray() {
+ return list.toArray();
+ }
+
+ @Override
+ public <X> X[] toArray(X[] a) {
+ return list.toArray(a);
+ }
+
+ @Override
+ public boolean add(T e) {
+ throw new UnsupportedOperationException("unmodifiable");
+ }
+
+ @Override
+ public boolean remove(Object o) {
+ throw new UnsupportedOperationException("unmodifiable");
+ }
+
+ @Override
+ public boolean containsAll(Collection<?> c) {
+ throw new UnsupportedOperationException(JUST_AN_ADAPTER);
+ }
+
+ @Override
+ public boolean addAll(Collection<? extends T> c) {
+ throw new UnsupportedOperationException("unmodifiable");
+ }
+
+ @Override
+ public boolean retainAll(Collection<?> c) {
+ throw new UnsupportedOperationException("unmodifiable");
+ }
+
+ @Override
+ public boolean removeAll(Collection<?> c) {
+ throw new UnsupportedOperationException("unmodifiable");
+ }
+
+ @Override
+ public void clear() {
+ throw new UnsupportedOperationException("unmodifiable");
+ }
+
+ @Override
+ public Comparator<? super T> comparator() {
+ throw new UnsupportedOperationException(JUST_AN_ADAPTER);
+ }
+
+ @Override
+ public SortedSet<T> subSet(T fromElement, T toElement) {
+ throw new UnsupportedOperationException(JUST_AN_ADAPTER);
+ }
+
+ @Override
+ public SortedSet<T> headSet(T toElement) {
+ throw new UnsupportedOperationException(JUST_AN_ADAPTER);
+ }
+
+ @Override
+ public SortedSet<T> tailSet(T fromElement) {
+ throw new UnsupportedOperationException(JUST_AN_ADAPTER);
+ }
+
+ @Override
+ public T first() {
+ if(size()==0) {
+ throw new NoSuchElementException("set is empty");
+ }
+ return list.get(0);
+ }
+
+ @Override
+ public T last() {
+ if(size()==0) {
+ throw new NoSuchElementException("set is empty");
+ }
+ return list.get(size()-1);
+ }
+}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/invocation/MethodIncompatibilityWorkaround.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/invocation/MethodIncompatibilityWorkaround.java
index e8a2920..46000b4 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/invocation/MethodIncompatibilityWorkaround.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/invocation/MethodIncompatibilityWorkaround.java
@@ -22,17 +22,12 @@ package org.apache.isis.core.metamodel.facets.actions.action.invocation;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Collection;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.Iterator;
-import java.util.LinkedHashSet;
import java.util.List;
-import java.util.NoSuchElementException;
import java.util.Set;
import java.util.SortedSet;
-import java.util.stream.Collectors;
import org.apache.isis.applib.internal.base._NullSafe;
+import org.apache.isis.applib.internal.collections._Collections;
/**
* Package private utility for method invocation pre-processing.
@@ -75,171 +70,26 @@ class MethodIncompatibilityWorkaround {
// allow no side effects on Collection arguments
if(Collection.class.equals(parameterType)) {
- return adaptAsCollection((List<?>)obj);
+ return _Collections.asUnmodifiableCollection((List<?>)obj);
}
// allow no side effects on List arguments
if(List.class.equals(parameterType)) {
- return adaptAsList((List<?>)obj);
+ return _Collections.asUnmodifiableList((List<?>)obj);
}
// adapt as Set (unmodifiable)
if(Set.class.equals(parameterType)) {
- return adaptAsSet((List<?>)obj);
+ return _Collections.asUnmodifiableSet((List<?>)obj);
}
// adapt as SortedSet (unmodifiable)
if(SortedSet.class.equals(parameterType)) {
- return adaptAsSortedSet((List<?>)obj);
+ return _Collections.asUnmodifiableSortedSet((List<?>)obj);
}
return obj;
}
- // -- COLLECTION ADAPTERS
-
- /**
- * Adapts the list as unmodifiable collection.
- * @param list
- * @return
- */
- private static <T> Collection<T> adaptAsCollection(final List<T> list) {
- return Collections.unmodifiableCollection(list);
- }
-
- /**
- * Adapts the list as unmodifiable list.
- * @param list
- * @return
- */
- private static <T> List<T> adaptAsList(final List<T> list) {
- return Collections.unmodifiableList(list);
- }
-
- /**
- * Preserves order, adapts the Set interface.
- * @param list
- * @return
- */
- private static <T> Set<T> adaptAsSet(final List<T> list) {
- return Collections.unmodifiableSet(
- (Set<T>)
- list.stream()
- .collect(Collectors.toCollection(LinkedHashSet::new)));
- }
-
- private final static String JUST_AN_ADAPTER =
- "this set is just an adapter, it has no information about the intended comparator";
-
- /**
- * Preserves order, adapts the SortedSet interface.
- * @param list
- * @return
- */
- private static <T> SortedSet<T> adaptAsSortedSet(final List<T> list) {
- return new SortedSet<T>() {
-
- @Override
- public int size() {
- return list.size();
- }
-
- @Override
- public boolean isEmpty() {
- return list.isEmpty();
- }
-
- @Override
- public boolean contains(Object o) {
- throw new UnsupportedOperationException(JUST_AN_ADAPTER);
- }
-
- @Override
- public Iterator<T> iterator() {
- return list.iterator();
- }
-
- @Override
- public Object[] toArray() {
- return list.toArray();
- }
-
- @Override
- public <X> X[] toArray(X[] a) {
- return list.toArray(a);
- }
-
- @Override
- public boolean add(T e) {
- throw new UnsupportedOperationException("unmodifiable");
- }
-
- @Override
- public boolean remove(Object o) {
- throw new UnsupportedOperationException("unmodifiable");
- }
-
- @Override
- public boolean containsAll(Collection<?> c) {
- throw new UnsupportedOperationException(JUST_AN_ADAPTER);
- }
-
- @Override
- public boolean addAll(Collection<? extends T> c) {
- throw new UnsupportedOperationException("unmodifiable");
- }
-
- @Override
- public boolean retainAll(Collection<?> c) {
- throw new UnsupportedOperationException("unmodifiable");
- }
-
- @Override
- public boolean removeAll(Collection<?> c) {
- throw new UnsupportedOperationException("unmodifiable");
- }
-
- @Override
- public void clear() {
- throw new UnsupportedOperationException("unmodifiable");
- }
-
- @Override
- public Comparator<? super T> comparator() {
- throw new UnsupportedOperationException(JUST_AN_ADAPTER);
- }
-
- @Override
- public SortedSet<T> subSet(T fromElement, T toElement) {
- throw new UnsupportedOperationException(JUST_AN_ADAPTER);
- }
-
- @Override
- public SortedSet<T> headSet(T toElement) {
- throw new UnsupportedOperationException(JUST_AN_ADAPTER);
- }
-
- @Override
- public SortedSet<T> tailSet(T fromElement) {
- throw new UnsupportedOperationException(JUST_AN_ADAPTER);
- }
-
- @Override
- public T first() {
- if(size()==0) {
- throw new NoSuchElementException("set is empty");
- }
- return list.get(0);
- }
-
- @Override
- public T last() {
- if(size()==0) {
- throw new NoSuchElementException("set is empty");
- }
- return list.get(size()-1);
- }
- };
- }
}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/ServicesInjector.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/ServicesInjector.java
index b9d9773..3f52cb4 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/ServicesInjector.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/ServicesInjector.java
@@ -28,6 +28,7 @@ import java.util.stream.Collectors;
import org.apache.isis.applib.annotation.Programmatic;
import org.apache.isis.applib.internal.base._NullSafe;
+import org.apache.isis.applib.internal.collections._Collections;
import org.apache.isis.applib.internal.collections._Lists;
import org.apache.isis.applib.internal.collections._Maps;
import org.apache.isis.applib.internal.collections._Multimaps;
@@ -290,16 +291,10 @@ public class ServicesInjector implements ApplicationScopedComponent {
final Class<? extends Collection<Object>> collectionTypeToBeInjected =
(Class<? extends Collection<Object>>) typeToBeInjected;
- final Collection<Object> collectionOfServices =
- CollectionUtils.collectIntoUnmodifiableCompatibleWithCollectionType(
-
- collectionTypeToBeInjected,
-
- _NullSafe.stream(services)
- .filter(_NullSafe::isPresent)
- .filter(isOfType(elementType))
-
- );
+ final Collection<Object> collectionOfServices = _NullSafe.stream(services)
+ .filter(_NullSafe::isPresent)
+ .filter(isOfType(elementType))
+ .collect(_Collections.toUnmodifiableOfType(collectionTypeToBeInjected));
invokeInjectorField(field, object, collectionOfServices);
});
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/CollectionUtils.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/CollectionUtils.java
index 7d8fe7b..80a35a0 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/CollectionUtils.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/CollectionUtils.java
@@ -22,17 +22,7 @@ package org.apache.isis.core.metamodel.specloader;
import java.lang.reflect.Field;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-import java.util.SortedSet;
-import java.util.TreeSet;
import java.util.function.Consumer;
-import java.util.stream.Collectors;
-import java.util.stream.Stream;
import javax.annotation.Nullable;
@@ -142,47 +132,5 @@ public final class CollectionUtils {
}
}
-
- // -- COLLECT ELEMENTS FROM STREAM
-
- /**
- * Collects elements from stream into a collection that is compatible with the given typeOfCollection.
- * @param typeOfCollection
- * @param elementStream
- * @return
- *
- * @throws IllegalArgumentException if the given typeOfCollection is not supported
- */
- public static <T> Collection<T> collectIntoUnmodifiableCompatibleWithCollectionType (
- Class<?> typeOfCollection, Stream<? extends T> elementStream) {
-
- if(SortedSet.class.equals(typeOfCollection)) {
- return Collections.unmodifiableSortedSet(
- elementStream.collect(Collectors.<T, SortedSet<T>>toCollection(TreeSet::new))
- );
- }
-
- if(Set.class.equals(typeOfCollection)) {
- return Collections.unmodifiableSet(
- elementStream.collect(Collectors.<T, Set<T>>toCollection(HashSet::new))
- );
- }
-
- if(List.class.equals(typeOfCollection)) {
- return Collections.unmodifiableList(
- elementStream.collect(Collectors.<T, List<T>>toCollection(ArrayList::new))
- );
- }
-
- if(Collection.class.equals(typeOfCollection)) {
- return Collections.unmodifiableCollection(
- elementStream.collect(Collectors.toCollection(ArrayList::new))
- );
- }
-
- throw new IllegalArgumentException(
- String.format("Can not collect into %s. Only List, Set, SortedSet and Collection are supported.",
- typeOfCollection.getClass().getName()));
- }
}
--
To stop receiving notification emails like this one, please contact
ahuber@apache.org.