RFC: draft API for JEP 269 Convenience Collection Factories
Ivan Gerasimov
ivan.gerasimov at oracle.com
Wed Oct 14 12:56:28 UTC 2015
Hi Stuart!
> Most of the API is pretty straightforward, with fixed-arg and varargs
> "of()" factories for List, Set, ArrayList, and HashSet; and with
> fixed-arg "of()" factories and varargs "ofEntries()" factories for Map
> and HashMap.
>
Has it been considered to separate a Map creation into two steps:
specifying keys and then values?
Varargs methods can then be used in each step.
I understand, that keeping the key and the value close each other looks
better in many cases.
However, separating them can allow some additional flexibility.
Here's a draft of what it might look like:
--------------------------------------------------------------------
import java.util.*;
import java.util.function.*;
public class MapOf {
public static void main(String[] a) {
Map<Integer,Character> m1 = MyCollections.<Integer,Character>
ofKeys( 1, 2, 3, 4, 5)
.vals( 'a', 'b', 'c', 'd', 'e');
m1.forEach((k, v) -> System.out.println("m1[" + k + "] = " + v));
Map<Integer,String> m2 = MyCollections.<Integer,String>
ofKeys( 1, 2, 3, 4, 5)
.calculateVals(k -> "#" + k + "#");
m2.forEach((k, v) -> System.out.println("m2[" + k + "] = " + v));
}
}
class MyCollections {
public static <K,V> KeysHolder<K,V> ofKeys(K... keys) {
return new KeysHolder<>(keys);
}
public static class KeysHolder<K,V> {
K[] keys;
KeysHolder(K[] keys) {
this.keys = keys;
}
public Map<K,V> vals(V... vals) {
if (vals.length != keys.length) {
throw new IllegalArgumentException();
}
Map<K,V> result = new HashMap<>();
for (int i = 0; i < keys.length; ++i) {
result.put(keys[i], vals[i]);
}
return result;
}
public Map<K,V> calculateVals(Function<K,V> fun) {
Map<K,V> result = new HashMap<>();
for (int i = 0; i < keys.length; ++i) {
result.put(keys[i], fun.apply(keys[i]));
}
return result;
}
}
}
--------------------------------------------------------------------
Sincerely yours,
Ivan
More information about the core-libs-dev
mailing list