久染

导航

Java day16【第二十九章】函数式编程

【第二十九章】函数式编程

一.Lamda表达式

interface IMessage{
    public void send(String str);
}
public class Message{
    public static void main(String[] args) {
            IMessage msg = new IMessage(){
                public void send(String str) {
                    System.out.println("Send Message:"+ str);
                }
            };
            msg.send("Tsy");
    }
 }

  匿名内部类,在这样的一个程序里,核心语句:

System.out.println("Send Message:"+ str);

  为了这一句话,我们需要严格遵守面向对象开发的流程进行。

范例:使用Lambda表达式实现相同功能:

interface IMessage{
    public void send(String str);
}
public class Message{
    public static void main(String[] args) {
            IMessage msg = (str)->{
                System.out.println("Send Message:"+ str);
            };
            msg.send("Tsy");
    }
 }

  现在整个程序代码编写了一行语句,避免了复杂的面向对象的过程。

  Lambda表达式:SAM(只有一个抽象方法)

  Lambda表达式格式:

    方法没有参数()->{};

    方法有参数:(参数,参数)->{};

    如果现在只有一行语句返回:(参数,参数)->{语句};

二.方法引用:

  引用数据类型最大的特点是可以进行内存的指向处理

  方法引用:不同的方法名称可以描述同一个方法。

1.方法引用的四种形式:

  (1)引用静态方法:类名称::static方法名称;

  (2)引用某个实例对象的方法:实例化对象::普通方法;

  (3)引用特定类型的方法:特定类::普通方法;

  (4)引用构造方法:类名称::new

范例:观察静态方法(String类中的String.valueOf()方法):

@FunctionalInterface        //函数式接口
interface IFunction<P,R>{
    public R change(P p);
}
public class Message{
    public static void main(String[] args) {
        IFunction<Integer,String> fun = String::valueOf;
        String str = fun.change(101);
        System.out.println(str.length());
    }
 }

范例:引用实例化对象中的方法

@FunctionalInterface        //函数式接口
interface IFunction<R>{
    public R upper();
}
public class Message{
    public static void main(String[] args) {
        IFunction<String> fun = "www.mldn.com"::toUpperCase;
        String str = fun.upper();
        System.out.println(str);
    }
 }

范例:特定类中的方法

String中比较大小的方法:public int compareTo(String anotherString);

@FunctionalInterface        //函数式接口
interface IFunction<R>{
    public int compare(R r1,R r2);
}
public class Message{
    public static void main(String[] args) {
        IFunction<String> fun = String::compareTo;
        System.out.println(fun.compare("a","A"));
    }
 }

范例:构造方法的引用(最具有杀伤力)

class Person
{
    private String name;
    private int age;
    public Person(String name,int age){
        this.name = name;
        this.age = age;
    }
    public String toString(){
        return "姓名:"+this.name + "、年龄:"+ this.age;
    }
}
@FunctionalInterface
interface IFunction<R>{
    public R create(String name,int age);
}
public class Message{
    public static void main(String[] args) {
        IFunction<Person> fun = Person::new;
        System.out.println(fun.create("张三",11).toString());
    }
 }

  提供方法引用的概念更多情况下也只是弥补了对于引用的支持功能。

posted on 2019-11-07 18:45  久染  阅读(166)  评论(0编辑  收藏  举报