簡體   English   中英

如何在Java中的Comparator類中使用lambda表達式

[英]How can I use lambda expressions in a Comparator class in Java

我是Java的新手,現在我必須創建一些Comparator類。

在這個Stackoverflow頁面上,我發現了一些關於使用lambda表達式的非常有用的信息。 如何通過多個字段比較對象

這讓我有關創建這樣的Compartor類的事情:

public class WidthComparator implements Comparator{
    @Override
    public int compare(Object t, Object t1) {
        Foto foto1 = (Foto)t;
        Foto foto2 = (Foto)t1;

        return Comparator.comparing(Foto::getWidth)
               .thenComparing(Foto::getHeight)
               .thenComparingInt(Foto::getName);
        }
    }    
}

所以當我有一個名為fotosCollection的集合時,我希望能夠這樣做:

fotosCollection.sort(new HoogteComparator());

這顯然不起作用,但我怎么能讓它工作?

PS。 我必須使用Comparator類。

Comparator.comapring返回一個Comparator - 您可以直接使用它:

// Define a "constant" comparator
private static final Comparator<Foo> HOOGTE_COMPARATOR = 
    Comparator.comparing(Foto::getWidth)
              .thenComparing(Foto::getHeight)
              .thenComparingInt(Foto::getName);

// Use it elsewhere in your code
fotosCollection.sort(HOOGTE_COMPARATOR);

如果由於某種原因你真的不希望比較器類型是匿名的,你可以這樣做:

public class WidthComparator implements Comparator<Foto>{
    private final static Comparator<Foto> FOTO_COMPARATOR = Comparator.comparing(Foto::getWidth)
        .thenComparing(Foto::getHeight)
        .thenComparingInt(Foto::getName);

    @Override
    public int compare(Foto foto1, Foto foto2) {    
        return FOTO_COMPARATOR.compare(foto1, foto2);        
    }    
}

我也會考慮避免使用rawtype並實現Comparator<Foto> ,就像我上面所做的那樣。

你可以嘗試這種舊式的方法:

public class WidthComparator implements Comparator{
    @Override
    public int compare(Object t, Object t1) {
        Foto foto1 = (Foto)t;
        Foto foto2 = (Foto)t1;

        // width asc order
        if(foto1.getWidth() != foto2.getWidth())
            return foto1.getWidth() - foto2.getWidth();

        // height asc order
        if(foto1.getHeight() != foto2.getHeight())
            return foto1.getHeight() - foto2.getHeight();

        // name asc order
        return foto1.getName().compareTo(foto2.getName());            
    }    
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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