RFR: 8180352: Add Stream.toList() method [v3]
sergus13
github.com+74766043+sergus13 at openjdk.java.net
Mon Nov 23 14:12:03 UTC 2020
On Sat, 21 Nov 2020 11:22:55 GMT, Rémi Forax <github.com+828220+forax at openjdk.org> wrote:
>> `listFromTrustedArrayNullsAllowed` is clearly not an option, as it will produce shared-secret leaking (see [JDK-8254090](https://bugs.openjdk.java.net/browse/JDK-8254090) for a similar case). StreamEx solution is dirty as it relies on the implementation detail. I believe, OpenJDK team is not very interested in providing optimal implementations for third-party stream implementations, as third-party implementations will likely update by themselves when necessary. At least, my suggestion to make the default `mapMulti` implementation better was declined.
>
> This implementation duplicates the array twice, once in this.toArray() and once in the constructor of ArrayList that calls toArray() on Collections.ArrayList.
>
> I'm sure there is a better way
In `ReferencePipeline` class we have:
@Override
public final Object[] toArray() {
return toArray(Object[]::new);
}
@Override
@SuppressWarnings("unchecked")
public final <A> A[] toArray(IntFunction<A[]> generator) {
...
@SuppressWarnings("rawtypes")
IntFunction rawGenerator = (IntFunction) generator;
return (A[]) Nodes.flatten(evaluateToArrayNode(rawGenerator), rawGenerator)
.asArray(rawGenerator);
}
In `Nodes` class we have:
public static <T> Node<T> flatten(Node<T> node, IntFunction<T[]> generator) {
if (node.getChildCount() > 0) {
...
T[] array = generator.apply((int) size);
new ToArrayTask.OfRef<>(node, array, 0).invoke();
return node(array);
} else {
return node;
}
}
It looks like it is required to implement `toList` method in a similar way in order to avoid array copy. i.e. there will be `IntFunction<List<T>> generator` which will generate 'ArrayList' with specified size and the list's `add` method will be called to add elements to the list.
-------------
PR: https://git.openjdk.java.net/jdk/pull/1026
More information about the core-libs-dev
mailing list