如何将特定的Comparator转换为Lambda表达式?

时间:2016-11-22 11:51:08

标签: java lambda java-8 comparator

我有一个管理歌曲列表,所以这是我现在排序歌曲的标准。我如何将其“转换”为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);
        }
    }

3 个答案:

答案 0 :(得分:3)

使用Allura;Password123;5.00;0.0;10.00 工厂方法和方法参考(如果可能):

Comparator

然后制作代码:

Comparator.<GestionCancion, Veces>comparing(gc -> gc.vecesQueSeRepite).reversed()
    .thenComparing(GestionCancion::dameInterprete);

诀窍是应用gestionCancionList.sort( Comparator.<GestionCancion, Veces>comparing(gc -> gc.vecesQueSeRepite).reversed() .thenComparing(GestionCancion::dameInterprete)); 来保持代码整洁。

请注意,访问字段时需要显式输入lambda(您尚未向我们显示reversed()的类型;我假设vecesQueSeRepite - 根据需要替换实际类型。

答案 1 :(得分:2)

更简单:

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

参数类型由比较器的泛型类型暗示。

编辑:它可以比上面更简单。比较器不需要单独定义。 lambda表达式可以立即传递给sort方法。同样在这种情况下,参数的类型由集合对象的泛型类型隐含。因此:

gestionCancionList.sort((t1,t2) -> t1.vecesQueSeRepite == t2.vecesQueSeRepite ? 
            t1.song.dameInterprete().compareTo(t2.song.dameInterprete())
            : (int)(t2.vecesQueSeRepite - t1.vecesQueSeRepite));

答案 2 :(得分:0)

简单

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

示例here