Working with Iterators and Comparators

1. Using Iterator Interface

MethodDetail
hasNext()Check next element
next()Return next, advance
remove()Remove last returned (optional op)
forEachRemaining(c)Java 8+
Warning: Modifying collection outside iterator throws ConcurrentModificationException.

2. Using ListIterator

Extra MethodsUse
hasPrevious / previousBidirectional
add(e)Insert at cursor
set(e)Replace last returned
nextIndex / previousIndexCursor position

3. Using Enhanced for Loop

AspectDetail
Syntaxfor (T x : iterable) { ... }
Works forArrays + Iterable
LimitationsNo index, cannot remove

4. Using forEach() Method

Example: forEach

list.forEach(System.out::println);
map.forEach((k, v) -> System.out.println(k + "=" + v));
SourceSignature
IterableforEach(Consumer)
MapforEach(BiConsumer)
StreamforEach (no order) / forEachOrdered

5. Implementing Comparable Interface

Example: Comparable

public class Version implements Comparable<Version> {
    int major, minor, patch;
    @Override public int compareTo(Version o) {
        if (major != o.major) return Integer.compare(major, o.major);
        if (minor != o.minor) return Integer.compare(minor, o.minor);
        return Integer.compare(patch, o.patch);
    }
}
ContractDetail
Sign<0 / 0 / >0
Antisymmetricsgn(a.compareTo(b)) == -sgn(b.compareTo(a))
Transitivea<b, b<c → a<c
Consistency with equalsStrongly recommended

6. Implementing Comparator Interface

ApproachDetail
Classclass ByLen implements Comparator<String>
Lambda(a,b) -> a.length() - b.length()
FactoryComparator.comparingInt(String::length)

7. Creating Comparator with Lambda

Example: Lambda comparator

Comparator<String> byLength = (a, b) -> Integer.compare(a.length(), b.length());
Comparator<User> byAge = Comparator.comparingInt(User::age);
TipDetail
Avoid a - b for intsOverflow risk; use Integer.compare
Null handlingUse Comparator.nullsFirst/nullsLast

8. Chaining Comparators

MethodUse
.thenComparing(other)Tiebreaker
.thenComparingInt(fn)Primitive optimization

9. Reversing Comparators

MethodBehavior
cmp.reversed()Reverses order
Comparator.reverseOrder()Natural reverse

10. Using Comparator Factory Methods

FactoryDescription
naturalOrder()Uses Comparable
comparing(keyFn)By extracted key
comparingInt/Long/DoubleAvoid boxing
nullsFirst(cmp) / nullsLast(cmp)Null-safe

11. Understanding Natural Ordering vs Custom Ordering

AspectComparableComparator
Defined inClass itselfExternal
One per classYesMany possible
MethodcompareTocompare
When to useInherent ordering existsMultiple/contextual orderings