Java 如何将特定比较器转换为Lambda表达式?

Java 如何将特定比较器转换为Lambda表达式?,java,lambda,java-8,comparator,Java,Lambda,Java 8,Comparator,我有一个管理歌曲列表,所以这是我现在对歌曲进行排序的标准。如何将其“转换”为lambda表达式 gestionCancionList.sort(new Comparator<GestionCancion>() { @Override public int compare(GestionCancion t1, GestionCancion t2){ return t1.vecesQueSeRepite == t2.vecesQue

我有一个管理歌曲列表,所以这是我现在对歌曲进行排序的标准。如何将其“转换”为lambda表达式

gestionCancionList.sort(new Comparator<GestionCancion>() {
        @Override
        public int compare(GestionCancion t1, GestionCancion t2){
            return t1.vecesQueSeRepite == t2.vecesQueSeRepite ?
                    t1.song.dameInterprete().compareTo(t2.song.dameInterprete())
                    : (int)(t2.vecesQueSeRepite - t1.vecesQueSeRepite);
        }
    }
gestionCancionList.sort(新的比较器(){
@凌驾
公共整数比较(GestionCancion t1、GestionCancion t2){
返回t1.vecesQueSeRepite==t2.vecesQueSeRepite?
t1.song.dameInterprete().compareTo(t2.song.dameInterprete())
:(int)(t2.vecesQueSeRepite-t1.vecesQueSeRepite);
}
}
简单

Comparator<GestionCancion> aName = (GestionCancion t1, GestionCancion t2)->t1.vecesQueSeRepite == t2.vecesQueSeRepite ?
                t1.song.dameInterprete().compareTo(t2.song.dameInterprete())
                : (int)(t2.vecesQueSeRepite - t1.vecesQueSeRepite);
Comparator aName=(GestionCancion t1,GestionCancion t2)->t1.vecesQueSeRepite==t2.vecesQueSeRepite?
t1.song.dameInterprete().compareTo(t2.song.dameInterprete())
:(int)(t2.vecesQueSeRepite-t1.vecesQueSeRepite);
一个更简单的例子是:

Comparator<GestionCancion> aName = (t1,t2) -> t1.vecesQueSeRepite == t2.vecesQueSeRepite ? 
            t1.song.dameInterprete().compareTo(t2.song.dameInterprete())
            : (int)(t2.vecesQueSeRepite - t1.vecesQueSeRepite);

使用带有方法参考的
比较器
工厂方法(如有可能):

Comparator.comparing(gc->gc.vecesQueSeRepite).reversed()
.然后比较(手势:dameInterprete);
然后制作代码:

gestionCancionList.sort(
  Comparator.<GestionCancion, Veces>comparing(gc -> gc.vecesQueSeRepite).reversed()
   .thenComparing(GestionCancion::dameInterprete));
gestionCancionList.sort(
Comparator.comparing(gc->gc.vecesQueSeRepite).reversed()
.然后比较(手势:dameInterprete));
诀窍是应用
reversed()
保持代码整洁


请注意,访问字段时需要显式键入lambda(您没有向我们显示
vecesQueSeRepite
是什么类型;我假设
Veces
-根据需要替换实际类型)非常感谢,所以我想如果我没有使用单一的方法,那么就编写与比较方法相同的方法。我想知道为什么不写:“Comparator aName=(GestionCancion t1,GestionCancion t2)->比较(t1,t2)”我还附上了一个简单的例子供参考。有希望但不幸的是,
vecesQueSeRespite
是一个字段,而不是一个方法,这些值的比较是反向的。@StuartMarks我更新了代码,更好地使用了
vecesQueSeRespite
字段的反向比较,但仍然不起作用。:-)不过努力还是要1分。使用
reversed()
时,类型推断往往会失败。另外,
dameInterprete
不是
GestionCancion
上的方法,因此必须使用lambda而不是方法引用。为了避免类型推断问题,我必须使用lambda参数的显式类型编写lambda,例如
(GestionCancion gc)->gc.song.dameInterprete()
。最后,
vecesQueSeRepite
看起来像某种类型的原语,因此应该使用
comparingit
或类似的方法来避免装箱。尽管如此,结果还是比原始答案或其他答案更可取。(我不是OP,否则我会接受你的答案。)关于为什么
reversed()
对你有效而对我无效:因为你使用的是方法引用,所以它们提供了足够的类型信息,这样事情才能正常进行。如果严格遵循OP的示例(使用字段),则必须使用lambda表达式而不是方法引用。(唉,还没有字段引用。)除非您提供更显式的类型信息,否则lambda表达式将无法工作。@StuartMarks确实如此。根据您的评论,使用所需的显式键入更新答案。我会记住那个提示!
Comparator.<GestionCancion, Veces>comparing(gc -> gc.vecesQueSeRepite).reversed()
    .thenComparing(GestionCancion::dameInterprete);
gestionCancionList.sort(
  Comparator.<GestionCancion, Veces>comparing(gc -> gc.vecesQueSeRepite).reversed()
   .thenComparing(GestionCancion::dameInterprete));