We show how to convert vavr collections to java collections.
Reference: https://static.javadoc.io/io.vavr/vavr/0.9.0/io/vavr/collection/List.html
In vavr, we have two approaches to converting vavr collections to java collections:
toJava*()
, where*
could be:List
,Array
,Set
...asJava()
The main difference between asJava()
and toJava*()
is that
a view from asJava()
is created in O(1)
(constant time)
whereas conversion (toJava*()
) takes O(n)
(linear time),
with n = collection size.
The operations on a view have the same performance characteristics than the underlying persistent Vavr collection whereas the performance characteristics of a converted collection are those of the Java standard collections.
Motivation: we often have to use java collections (in frameworks...).
Reference: https://static.javadoc.io/io.vavr/vavr/0.9.0/io/vavr/Value.html
Converts vavr collections to java collections by copying the content, for example:
java.util.List<T> toJavaList() {
return ValueModule.toJavaCollection(this, ArrayList::new, 10);
}
where:
static <T, R extends java.util.Collection<T>> R toJavaCollection(
Value<T> value, Function<Integer, R> containerSupplier, int defaultInitialCapacity) {
final int size;
if (value instanceof Traversable && ((Traversable) value).isTraversableAgain() && !value.isLazy()) {
size = ((Traversable) value).size();
} else {
size = defaultInitialCapacity;
}
final R container = containerSupplier.apply(size);
value.forEach(container::add);
return container;
}
methods summary:
Object[] toJavaArray()
,T[] toJavaArray(Class<T> componentType)
,<C extends Collection<T>> C toJavaCollection(Function<Integer,C> factory)
,List<T> toJavaList()
,<LIST extends List<T>> LIST toJavaList(Function<Integer,LIST> factory)
,Map<K,V> toJavaMap(Function<? super T,? extends Tuple2<? extends K,? extends V>> f)
,<K,V,MAP extends Map<K,V>> MAP toJavaMap(Supplier<MAP> factory, Function<? super T,? extends K> keyMapper, Function<? super T,? extends V> valueMapper)
,<K,V,MAP extends Map<K,V>> MAP toJavaMap(Supplier<MAP> factory, Function<? super T,? extends Tuple2<? extends K,? extends V>> f)
,Optional<T> toJavaOptional()
,Stream<T> toJavaStream()
,Stream<T> toJavaParallelStream()
,Set<T> toJavaSet()
,<SET extends Set<T>> SET toJavaSet(Function<Integer,SET> factory)
Reference: https://static.javadoc.io/io.vavr/vavr/0.9.2/io/vavr/collection/Seq.html
Creates an immutable List
view on top of this Seq
,
i.e. calling mutators will result in
UnsupportedOperationException
at runtime.
Please note that our immutable java.util.List
view
throws UnsupportedOperationException
before checking
method arguments. Java does handle this case inconsistently.
List<T> asJava()
List<T> asJava(Consumer<? super List<T>> action)
Note that we have also mutable equivalents:List<T> asJavaMutable()
List<T> asJavaMutable(Consumer<? super List<T>> action)