I came to this code
Collections.sort(list, (o1, o2) -> o1.getValue().compareTo(o2.getValue()));
and I'm wondering, is it just a syntactic sugar for
Collections.sort(list, new Comparator<CodeTableEntry>() {
@Override
public int compare(CodeTableEntry o1, CodeTableEntry o2) {
return o1.getValue().compareTo(o2.getValue());
}
});
or it is something smarter? Is it optimized not to create new instance everytime?
It's just my opinion, but such non-trivial one-liner is not better as easy to follow straightforward code... (which is not the one above, but one below)
static final Comparator<CodeTableEntry> codeTableEntryValueComparator = new Comparator<CodeTableEntry>() {
@Override
public int compare(CodeTableEntry o1, CodeTableEntry o2) {
return o1.getValue().compareTo(o2.getValue());
}
};
...
Collections.sort(list, codeTableEntryValueComparator);
...
Clarification to "Is it optimized not to create new instance everytime?"
As there is just one new
I believed it's clear, seems it's not. I did this code to check:
public class ComparatorTest {
private static void sort(List<String> list) {
Collections.sort(list, new Comparator<String>() {
@Override
public int compare(String s1, String s2) {
System.out.println("comparator: " + this);
return s1.compareTo(s2);
}
});
System.out.println("sorted: " + list);
}
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("c");
sort(list);
list.add("b");
sort(list);
list.add("a");
sort(list);
}
}
and the output is
sorted: [c]
comparator: ComparatorTest$1@7852e922
sorted: [b, c]
comparator: ComparatorTest$1@4e25154f
comparator: ComparatorTest$1@4e25154f
comparator: ComparatorTest$1@4e25154f
comparator: ComparatorTest$1@4e25154f
sorted: [a, b, c]
which I believe shows, there is new instance of Comparator (because of different hash code) created for each method call
How to check with lambdas, just for my testing I printed stacktrace when I created an exception
Collections.sort(list, (o1, o2) -> getValue(o1).compareTo(o2));
where getValue
is
public static String getValue(String s) {
RuntimeException re = new RuntimeException();
re.printStackTrace(System.out);
return s;
}
and it printed
sorted: [c]
java.lang.RuntimeException
at ComparatorTest.getValue(ComparatorTest.java:20)
at ComparatorTest.lambda$0(ComparatorTest.java:15)
at java.util.TimSort.countRunAndMakeAscending(Unknown Source)
at java.util.TimSort.sort(Unknown Source)
at java.util.Arrays.sort(Unknown Source)
at java.util.ArrayList.sort(Unknown Source)
at java.util.Collections.sort(Unknown Source)
at ComparatorTest.sort(ComparatorTest.java:15)
at ComparatorTest.main(ComparatorTest.java:32)
sorted: [b, c]
java.lang.RuntimeException
at ComparatorTest.getValue(ComparatorTest.java:20)
at ComparatorTest.lambda$0(ComparatorTest.java:15)
at java.util.TimSort.countRunAndMakeAscending(Unknown Source)
at java.util.TimSort.sort(Unknown Source)
at java.util.Arrays.sort(Unknown Source)
at java.util.ArrayList.sort(Unknown Source)
at java.util.Collections.sort(Unknown Source)
at ComparatorTest.sort(ComparatorTest.java:15)
at ComparatorTest.main(ComparatorTest.java:34)
java.lang.RuntimeException
at ComparatorTest.getValue(ComparatorTest.java:20)
at ComparatorTest.lambda$0(ComparatorTest.java:15)
at java.util.TimSort.countRunAndMakeAscending(Unknown Source)
at java.util.TimSort.sort(Unknown Source)
at java.util.Arrays.sort(Unknown Source)
at java.util.ArrayList.sort(Unknown Source)
at java.util.Collections.sort(Unknown Source)
at ComparatorTest.sort(ComparatorTest.java:15)
at ComparatorTest.main(ComparatorTest.java:34)
java.lang.RuntimeException
at ComparatorTest.getValue(ComparatorTest.java:20)
at ComparatorTest.lambda$0(ComparatorTest.java:15)
at java.util.TimSort.binarySort(Unknown Source)
at java.util.TimSort.sort(Unknown Source)
at java.util.Arrays.sort(Unknown Source)
at java.util.ArrayList.sort(Unknown Source)
at java.util.Collections.sort(Unknown Source)
at ComparatorTest.sort(ComparatorTest.java:15)
at ComparatorTest.main(ComparatorTest.java:34)
java.lang.RuntimeException
at ComparatorTest.getValue(ComparatorTest.java:20)
at ComparatorTest.lambda$0(ComparatorTest.java:15)
at java.util.TimSort.binarySort(Unknown Source)
at java.util.TimSort.sort(Unknown Source)
at java.util.Arrays.sort(Unknown Source)
at java.util.ArrayList.sort(Unknown Source)
at java.util.Collections.sort(Unknown Source)
at ComparatorTest.sort(ComparatorTest.java:15)
at ComparatorTest.main(ComparatorTest.java:34)
sorted: [a, b, c]
and there seems to be just one ComparatorTest.lambda$0
...