我有一个对象列表,我需要在一个字段上排序,比如分数.在没有多想的情况下,我编写了一个实现Comparator的新类,它可以执行任务并且可以正常运行.
现在回过头来看,我想知道我是否应该让我的类实现Comparable,而不是创建一个实现Comparator的新类.分数是对象将被订购的唯一字段.
我做过什么可以接受的做法?
是正确的方法"首先让类实现Comparable(对于自然顺序),如果需要替代字段比较,那么创建一个实现Comparator的新类"?
如果上面的(2)为真,那么它是否意味着只有在具有类实现Comparable之后才应该实现Comparator?(假设我拥有原始课程).
由于Java8最近已经发布,并且它的全新lambda表达式看起来非常酷,我想知道这是否意味着我们习以为常的Anonymous类的消亡.
我一直在研究这个问题,并找到了一些很酷的例子,说明Lambda表达式将如何系统地替换这些类,例如Collection的sort方法,它用于获取Comparator的Anonymous实例来执行排序:
Collections.sort(personList, new Comparator<Person>(){
public int compare(Person p1, Person p2){
return p1.firstName.compareTo(p2.firstName);
}
});
Run Code Online (Sandbox Code Playgroud)
现在可以使用Lambdas完成:
Collections.sort(personList, (Person p1, Person p2) -> p1.firstName.compareTo(p2.firstName));
Run Code Online (Sandbox Code Playgroud)
而且看起来非常简洁.所以我的问题是,有没有理由继续在Java8中使用这些类而不是Lambdas?
编辑
同样的问题,但在相反的方向,使用Lambdas而不是匿名类有什么好处,因为Lambdas只能用于单个方法接口,这个新功能只是在少数情况下使用的快捷方式还是真的有用?
我想知道lambdas在Java 8中有多大的好处.我同意有时使用lambdas可能更具可读性,但是它对性能方面有多大影响吗?或者主要是作为语法糖?我有时喜欢匿名的内部课程; 当我不经常使用lambda时,我真的会失去很多好处吗?
唯一的?大?在我看来,性能增益是我们实际上并没有创建类加载器必须在程序开始时加载的类 - 例如创建许多线程:
Thread t = new Thread(new Runnable() {
public.....
});
Run Code Online (Sandbox Code Playgroud)
创建类似的类Sample$1.class.
除此之外,除了代码的可读性或可维护性等之外,还有任何性能或其他隐藏的收益吗?隐藏在JVM的某个地方?我已经看到了类似的问题,但大多数都集中在视觉方面; 我对此不感兴趣.在观看使用Venkat Subramaniam的Java 8 Lambdas Hacking之后,问题出于好奇.