Let's assume that we are defining the following Comparator for Melon:
public class MelonComparator implements Comparator {
@Override
public int compare(Object m1, Object m2) {
return Integer.compare(((Melon) m1).getWeight(),
((Melon) m2).getWeight());
}
}
Now, we can refer to it as follows:
- No method reference:
MelonComparator mc = new MelonComparator();
List<Melon> sorted = melons.stream()
.sorted((Melon m1, Melon m2) -> mc.compare(m1, m2))
.collect(Collectors.toList());
- Method reference:
List<Melon> sorted = melons.stream()
.sorted(mc::compare)
.collect(Collectors.toList());
Of course, we can call Integer.compare() directly as well:
- No method reference:
List<Integer> sorted = melons.stream()
.map(m -> m.getWeight())
.sorted((m1, m2) -> Integer.compare(m1, m2))
.collect(Collectors.toList());
- Method reference:
List<Integer> sorted = melons.stream()
.map(m -> m.getWeight())
.sorted(Integer::compare)
.collect(Collectors.toList());