簡體   English   中英

使用lambda代替顯式類

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM