使用lambda表达式的枚举重写方法

使用lambda表达式的枚举重写方法,lambda,interface,enums,java-8,comparator,Lambda,Interface,Enums,Java 8,Comparator,我有两种解决方案,可以让枚举形成一个比较器库: public enum SongComparator { BY_TITLE(Comparator.comparing(Song::getTitle)), BY_ARTIST(Comparator.comparing(Song::getArtist)), BY_DURATION(Comparator.comparing(Song::getDuration)); private Comparator<Song&

我有两种解决方案,可以让枚举形成一个比较器库:

public enum SongComparator {

    BY_TITLE(Comparator.comparing(Song::getTitle)),
    BY_ARTIST(Comparator.comparing(Song::getArtist)),
    BY_DURATION(Comparator.comparing(Song::getDuration));

    private Comparator<Song> comp;

    private SongComparator(Comparator<Song> comp) {
        this.comp = comp;
    }

    public Comparator<Song> get() {
        return comp;
    }
}
公共枚举比较器{
按标题(Comparator.comparing(Song::getTitle)),
由艺术家(比较器。比较(歌曲::getArtist)),
通过持续时间(Comparator.comparing(Song::getDuration));
私人比较公司;
专用SongComparator(Comparator comp){
this.comp=comp;
}
公共比较器get(){
返回补偿;
}
}
而且

public enum SongComparator2 implements Comparator<Song> {

    BY_TITLE {
        public int compare(Song s1, Song s2) {
            return s1.getTitle().compareTo(s2.getTitle());
        };
    },
    BY_ARTIST {
        public int compare(Song s1, Song s2) {
            return s1.getArtist().compareTo(s2.getArtist());
        };
    },
    BY_DURATION {
        public int compare(Song s1, Song s2) {
            return Integer.compare(s1.getDuration(), s2.getDuration());
        };
    };

}
公共枚举SongComparator2实现Comparator{
按标题{
公共整数比较(歌曲s1、歌曲s2){
返回s1.getTitle().compareTo(s2.getTitle());
};
},
艺术家{
公共整数比较(歌曲s1、歌曲s2){
返回s1.getArtist().compareTo(s2.getArtist());
};
},
按持续时间{
公共整数比较(歌曲s1、歌曲s2){
返回整数.compare(s1.getDuration(),s2.getDuration());
};
};
}
如果我想在需要比较器的地方替换一个枚举值,在第一个解决方案中,我必须说songparator.BY_TITLE.get();而在第二种解决方案中,我只能说SongComparator2.BY_TITLE

从这个意义上说,第二个更好,但是,我不喜欢写公共int比较。。。对于每个枚举值,使用Comparator.comparing作为第一种方法。有没有办法做到这一点

我几乎想说这样的话:BY_TITLE{returncomparator.comparating(Song::getTitle);}

有什么问题吗:

public enum SongComparator implements Comparator<Song> {

    BY_TITLE(Comparator.comparing(Song::getTitle)),
    BY_ARTIST(Comparator.comparing(Song::getArtist)),
    BY_DURATION(Comparator.comparing(Song::getDuration));

    private Comparator<Song> comp;

    private SongComparator(Comparator<Song> comp) {
        this.comp = comp;
    }

    public int compare(Song s1, Song s2) {
        return comp.compare(s1, s2);
    };

}
公共枚举SongComparator实现Comparator{
按标题(Comparator.comparing(Song::getTitle)),
由艺术家(比较器。比较(歌曲::getArtist)),
通过持续时间(Comparator.comparing(Song::getDuration));
私人比较公司;
专用SongComparator(Comparator comp){
this.comp=comp;
}
公共整数比较(歌曲s1、歌曲s2){
返回比较(s1,s2);
};
}
有什么问题:

public enum SongComparator implements Comparator<Song> {

    BY_TITLE(Comparator.comparing(Song::getTitle)),
    BY_ARTIST(Comparator.comparing(Song::getArtist)),
    BY_DURATION(Comparator.comparing(Song::getDuration));

    private Comparator<Song> comp;

    private SongComparator(Comparator<Song> comp) {
        this.comp = comp;
    }

    public int compare(Song s1, Song s2) {
        return comp.compare(s1, s2);
    };

}
公共枚举SongComparator实现Comparator{
按标题(Comparator.comparing(Song::getTitle)),
由艺术家(比较器。比较(歌曲::getArtist)),
通过持续时间(Comparator.comparing(Song::getDuration));
私人比较公司;
专用SongComparator(Comparator comp){
this.comp=comp;
}
公共整数比较(歌曲s1、歌曲s2){
返回比较(s1,s2);
};
}

注意,该问题中的示例向您展示了如何避免在委派变量中调用
get()
。您真的需要枚举吗?为什么不将这3个比较器设置为类的常量,而不是枚举实例?请注意,该问题中的示例向您展示了如何避免在委派变量中调用
get()
。您真的需要枚举吗?为什么不让这3个比较器成为一个类的常量,而不是枚举实例呢?啊,是的,这样就可以了!只是为了再次检查-如果要将此实现传递给sort(…)方法,例如,我传递了SongComparator.BY_TITLE。我假设键提取器函数(Comparator.comparating)将只调用一次,以初始化枚举的字段,而不是在排序对重写的比较方法进行的每次回调期间调用?相反,我假设所发生的一切只是从枚举的重写比较方法到组合比较器所持有的方法的一个简单的委托步骤?枚举只是声明类的奇特方式。一旦所有的实例构造函数都运行了,你只剩下一个枚举实例,它是一个普通的对象。啊,是的,这就可以了!只是为了再次检查-如果要将此实现传递给sort(…)方法,例如,我传递了SongComparator.BY_TITLE。我假设键提取器函数(Comparator.comparating)将只调用一次,以初始化枚举的字段,而不是在排序对重写的比较方法进行的每次回调期间调用?相反,我假设所发生的一切只是从枚举的重写比较方法到组合比较器所持有的方法的一个简单的委托步骤?枚举只是声明类的奇特方式。一旦运行了所有实例构造函数,就只剩下一个枚举实例,它是一个普通对象。