[英]Usage of lambdas instead of explicit classes
我有使用顯式類對值進行排序的程序:
class CompLastNames implements Comparator<String> {
public int compare(String aStr, String bStr) {
int i, j;
i = aStr.lastIndexOf(' ');
j = bStr.lastIndexOf(' ');
return aStr.substring(i).compareToIgnoreCase(bStr.substring(j));
}
}
class CompThenByFirstName implements Comparator<String> {
public int compare(String aStr, String bStr) {
int i, j;
return aStr.compareToIgnoreCase(bStr);
}
}
public class TreeMapDemo2A {
public static void main(String[] args) {
CompLastNames compLN = new CompLastNames();
Comparator<String> compLastThenFirst =
compLN.thenComparing(new CompThenByFirstName());
TreeMap<String, Double> tm =
new TreeMap<String, Double>(compLastThenFirst);
...
並得到結果:
Jane Baker: 1378.0
John Doe: 3434.34
Ralph Smith: -19.08
Tom Smith: 123.22
Tod Hull: 99.22
The new account balance of John Doe: 4434.34
然后,我嘗試添加lambda而不是像這樣的顯式類:
Comparator<String> compLastThenFirst =
((aStr, bStr) -> aStr.compareToIgnoreCase(bStr));
TreeMap<String, Double> tm =
new TreeMap<String, Double>((aStr, bStr) -> aStr.substring(aStr.lastIndexOf(' ')).compareToIgnoreCase(bStr.substring(bStr.lastIndexOf(' '))));
結果是:
Jane Baker: 1378.0
John Doe: 3434.34
Tom Smith: -19.08
Tod Hull: 99.22
The new account balance of John Doe: 4434.34
但是我沒有完整的清單(沒有Ralph Smith:-19.08) 。 有誰知道怎么寫? 謝謝。
UPD:
1)
Comparator<String> compLastThenFirst =
((Comparator<String>) (a, b) -> a.substring(a.lastIndexOf(' ')).compareToIgnoreCase(b.substring(b.lastIndexOf(' '))))
.thenComparing((a, b) -> a.compareToIgnoreCase(b));
TreeMap<String, Double> tm =
new TreeMap<String, Double>(compLastThenFirst);
...
2)
Comparator<String> compLN = (aStr, bStr) ->
aStr.substring(aStr.lastIndexOf(' '))
.compareToIgnoreCase(bStr.substring(bStr.lastIndexOf(' ')));
Comparator<String> compLastThenFirst =
compLN.thenComparing((aStr, bStr) -> aStr.compareToIgnoreCase(bStr));
TreeMap<String, Double> tm =
new TreeMap<String, Double>(compLastThenFirst);
...
您將需要重新實現thenComparing(Comparator)
功能:
(aStr, bStr) -> {
int compareResult =
aStr.substring(aStr.lastIndexOf(' '))
.compareToIgnoreCase(
bStr.substring(bStr.lastIndexOf(' '))
)
if (compareResult != 0)
compareResult = aStr.compareToIgnoreCase(bStr);
return compareResult;
}
(另請參閱OpenJDK源代碼 。)
或者您可以通過分配一個臨時變量來使用thenComparing
(如第一個示例中所示):
Comparator<String> compLN = (aStr, bStr) ->
aStr.substring(aStr.lastIndexOf(' '))
.compareToIgnoreCase(bStr.substring(bStr.lastIndexOf(' ')));
Comparator<String> compLastThenFirst =
compLN.thenComparing((aStr, bStr) -> aStr.compareToIgnoreCase(bStr));
但是,使用comparing(Function,Comparator)
編寫這樣的比較器的最簡單方法可能是這樣的:
Comparator.comparing(str -> str.substring(str.lastIndexOf(' ')),
String.CASE_INSENSITIVE_ORDER)
.thenComparing(String.CASE_INSENSITIVE_ORDER)
(另請參見String.CASE_INSENSITIVE_ORDER
文檔。)
正如@Sweeper在評論中提到的那樣,您忘記了對Comparator#thenComparing
的調用。 帶有lambda表達式的相應代碼為:
Comparator<String> compLastThenFirst =
((Comparator<String>) (a, b) -> a.substring(a.lastIndexOf(' ')).compareToIgnoreCase(b.substring(b.lastIndexOf(' '))))
.thenComparing((a, b) -> a.compareToIgnoreCase(b));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.