java中的实现接口类、lambda表达式和内部类

本文参考自: 原文地址

以一个我们熟悉的排序算法的例子开始:

class LengthComparator implements Comparator<String>
{
    public int compare(String first, String second)
    {
        return first.length() - second.length();
    }
}
...
Arrays.sort(strings, new LengthComparator());

在这个例子中,为了对一个字符串数组strings按字符串长度排序,我们要给sort方法传入一个实现了Comparator<String>接口的类的对象,其实,sort方法想要知道的只是compare方法,但是java是面向对象的语言,为了将这个方法传进来,不得不这么费力地定义一个类,再生成这个类的实例对象传进来,从而实现了传递compare方法的目的。

而lambda表达式能够简洁地解决这个问题,比如说,对于这个问题,只需:

Arrays.sort(planets, (first, second) -> first.length() - second.length());

其实,lambda表达式的应用是与函数式接口联系在一起的。函数式接口指的是只有一个抽象方法声明的接口,每一个lambda表达式都能隐式地赋值给函数式接口,如:

Runnable r = () -> System.out.println("hello world");

这个问题我们也可以用内部类来解决。由于这段代码只在这一块用得到,所以没必要专门生成一个类,这样的类在别的地方也用不到,所以可以在这个类的内部生成一个专门在这里使用的类,即内部类,这里,内部类甚至连名称都可以没有,称为匿名内部类:

arrys.sort(strings,new Comparator(){
    public int compare(String first, String second)
        {
            return first.length() - second.length();
        }
})
对于内部类,还有对外部类的可见性等特点,这里不再过多进行介绍。


猜你喜欢

转载自blog.csdn.net/running987/article/details/81477038