🏷 Collections
16 patterns
Topic: Collections
All Java patterns related to Collections — java.evolved
Language
Raw collections to generic types
Old
List names = new ArrayList();
names.add("Duke");
String name = (String) names.get(0);
Modern
List<String> names = new ArrayList();
names.add("Duke");
String name = names.get(0);
hover to see modern →
JDK 5+
learn more →
Collections
Immutable list creation
Old
List<String> list =
Collections.unmodifiableList(
new ArrayList<>(
Arrays.asList("a", "b", "c")
)
);
Modern
List<String> list =
List.of("a", "b", "c");
hover to see modern →
JDK 9+
learn more →
Collections
Immutable map creation
Old
Map<String, Integer> map = new HashMap<>();
map.put("a", 1);
map.put("b", 2);
map.put("c", 3);
map = Collections.unmodifiableMap(map);
Modern
Map<String, Integer> map =
Map.of("a", 1, "b", 2, "c", 3);
hover to see modern →
JDK 9+
learn more →
Collections
Immutable set creation
Old
Set<String> set =
Collections.unmodifiableSet(
new HashSet<>(
Arrays.asList("a", "b", "c")
)
);
Modern
Set<String> set =
Set.of("a", "b", "c");
hover to see modern →
JDK 9+
learn more →
Collections
Copying collections immutably
Old
List<String> copy =
Collections.unmodifiableList(
new ArrayList<>(original)
);
Modern
List<String> copy =
List.copyOf(original);
hover to see modern →
JDK 10+
learn more →
Collections
Map.entry() factory
Old
Map.Entry<String, Integer> e =
new AbstractMap.SimpleEntry<>(
"key", 42
);
Modern
var e = Map.entry("key", 42);
hover to see modern →
JDK 9+
learn more →
Collections
Sequenced collections
Old
// Get last element
Object last = list.get(list.size() - 1);
// Get first
Object first = list.get(0);
// Reverse iteration: manual
Modern
var last = list.getLast();
var first = list.getFirst();
var reversed = list.reversed();
hover to see modern →
JDK 21+
learn more →
Collections
Typed stream toArray
Old
List<String> list = getNames();
List<String> filtered = new ArrayList<>();
for (String n : list) {
if (n.length() > 3) {
filtered.add(n);
}
}
String[] arr = filtered.toArray(new String[0]);
Modern
String[] arr = getNames().stream()
.filter(n -> n.length() > 3)
.toArray(String[]::new);
hover to see modern →
JDK 8+
learn more →
Collections
Reverse list iteration
Old
for (ListIterator<String> it =
list.listIterator(list.size());
it.hasPrevious(); ) {
String element = it.previous();
System.out.println(element);
}
Modern
for (String element : list.reversed()) {
IO.println(element);
}
hover to see modern →
JDK 21+
learn more →
Collections
Unmodifiable collectors
Old
List<String> list = stream.collect(
Collectors.collectingAndThen(
Collectors.toList(),
Collections::unmodifiableList
)
);
Modern
List<String> list = stream.toList();
hover to see modern →
JDK 16+
learn more →
Collections
Legacy synchronized collections to modern alternatives
Old
Hashtable<String, Session> sessions = new Hashtable<>();
sessions.put(id, session);
Modern
ConcurrentMap<String, Session> sessions = new ConcurrentHashMap<>();
sessions.put(id, session);
hover to see modern →
JDK 5+
learn more →
Collections
Atomic map updates with compute and merge
Old
List<String> values = groups.get(key);
if (values == null) {
values = new ArrayList<>();
groups.put(key, values);
}
values.add(value);
Modern
groups.computeIfAbsent(key, ignored -> new ArrayList<>())
.add(value);
hover to see modern →
JDK 8+
learn more →
Collections
Stack to Deque and ArrayDeque
Old
Stack<String> stack = new Stack<>();
stack.push("task");
String next = stack.pop();
Modern
Deque<String> stack = new ArrayDeque<>();
stack.push("task");
String next = stack.pop();
hover to see modern →
JDK 6+
learn more →
Collections
Collection bulk operations instead of mutation loops
Old
for (Iterator<Order> it = orders.iterator(); it.hasNext();) {
if (it.next().cancelled()) {
it.remove();
}
}
Modern
orders.removeIf(Order::cancelled);
hover to see modern →
JDK 8+
learn more →
Collections
Comparator factories and fluent ordering
Old
people.sort(new Comparator<Person>() {
@Override
public int compare(Person a, Person b) {
int byName = a.name().compareTo(b.name());
return byName != 0 ? byName : Integer.compare(a.age(), b.age());
}
});
Modern
people.sort(Comparator.comparing(Person::name)
.thenComparingInt(Person::age));
hover to see modern →
JDK 8+
learn more →
Streams
Stream.toList()
Old
List<String> result = stream
.filter(s -> s.length() > 3)
.collect(Collectors.toList());
Modern
List<String> result = stream
.filter(s -> s.length() > 3)
.toList();
hover to see modern →
JDK 16+
learn more →