黑马程序员技术交流社区

标题: 【广州校区】 +lambda方法的引用 [打印本页]

作者: 忽忽糊糊虎虎    时间: 2018-4-6 15:25
标题: 【广州校区】 +lambda方法的引用
方法引用
________________________________________
方法引用是Lambda表达式的一个简化写法。所引用的方法其实是Lambda表达式的方法体的实现,其语法结构为:
ObjectRef::methodName
左边可以是类名或者实例名,中间是方法引用符号”::”,右边是相应的方法名。方法引用被分为三类:
1. 静态方法引用
在某些情况下,我们可能写出这样的代码:
public class ReferenceTest {
    public static void main(String[] args) {
        Converter<String ,Integer> converter=new Converter<String, Integer>() {
            @Override
            public Integer convert(String from) {
                return ReferenceTest.String2Int(from);
            }
        };
        converter.convert("120");

    }


    @FunctionalInterface
    interface Converter<F,T>{
        T convert(F from);
    }

    static int String2Int(String from) {
        return Integer.valueOf(from);
    }
}
这时候如果用静态引用会使的代码更加简洁:
Converter<String, Integer> converter = ReferenceTest::String2Int;
converter.convert("120");
2. 实例方法引用
我们也可能会写下这样的代码:
public class ReferenceTest {
    public static void main(String[] args) {

        Converter<String, Integer> converter = new Converter<String, Integer>() {
            @Override
            public Integer convert(String from) {
                return new Helper().String2Int(from);
            }
        };
        converter.convert("120");
    }


    @FunctionalInterface
    interface Converter<F, T> {
        T convert(F from);
    }

    static class Helper {
        public int String2Int(String from) {
            return Integer.valueOf(from);
        }
    }
}
同样用实例方法引用会显得更加简洁:
  Helper helper = new Helper();
  Converter<String, Integer> converter = helper::String2Int;
  converter.convert("120");
3. 构造方法引用
现在我们来演示构造方法的引用。首先我们定义一个父类Animal:
class Animal{
        private String name;
        private int age;

        public Animal(String name, int age) {
            this.name = name;
            this.age = age;
        }

       public void behavior(){

        }
    }
接下来,我们在定义两个Animal的子类:Dog、Bird
public class Bird extends Animal {

    public Bird(String name, int age) {
        super(name, age);
    }

    @Override
    public void behavior() {
        System.out.println("fly");
    }
}

class Dog extends Animal {

    public Dog(String name, int age) {
        super(name, age);
    }

    @Override
    public void behavior() {
        System.out.println("run");
    }
}
随后我们定义工厂接口:
interface Factory<T extends Animal> {
        T create(String name, int age);
    }
接下来我们还是用传统的方法来创建Dog类和Bird类的对象:
Factory factory=new Factory() {
            @Override
            public Animal create(String name, int age) {
                return new Dog(name,age);
            }
        };
        factory.create("alias", 3);
        factory=new Factory() {
            @Override
            public Animal create(String name, int age) {
                return new Bird(name,age);
            }
        };
        factory.create("smook", 2);
两个对象就写了十多号代码,现在我们用构造函数引用试试:
  Factory<Animal> dogFactory =Dog::new;
  Animal dog = dogFactory.create("alias", 4);

  Factory<Bird> birdFactory = Bird::new;
  Bird bird = birdFactory.create("smook", 3);
这样代码就显得干净利落了。通过Dog::new这种方式来穿件对象时,Factory.create函数的签名选择相应的造函数。


作者: Yin灬Yan    时间: 2018-4-7 19:03
我来占层楼啊   




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2