Java Lambda 表达式

Lambda 表达式

1-函数式编程思想

Lambda表达式是函数式编程思想的体现

函数式编程思想:更在意过程,并不在意实现的形式;

面向对象编程思想:一切动作都通过对象来实现。

2-Lambda基本介绍

2.1-Lambda表达式的格式

() -> {}

  • ():接口中唯一要实现的方法的形参列表

  • ->:指向需要需要执行的代码块(函数体),读作: goes to

  • {}: 代码块,也叫方法体或者函数体

    传统匿名内部类实现线程

    
    /**
     * @author Object(object_hui@sina.com)
     * @description Lambda格式
     * @date 2020/9/18
     */
    public class Lambda {
        public static void main(String[] args) {
            //使用内部方法实现线程接口Runnable,创建了线程
            Thread thread = new Thread(new Runnable() {
                @Override
                public void run() {
                    System.out.println("一个内部类线程被创建了!~");
                }
            });
            thread.start();
        }
    }
    

    使用Lambda表达式实现线程

    /**
     * @author Object(object_hui@sina.com)
     * @description Lambda格式
     * @date 2020/9/18
     */
    public class Lambda {
        public static void main(String[] args) {
            //使用Lambda表达式 ,实现接口方法格式为: ()->{}
            Thread thread1 = new Thread(() -> {System.out.println("一个Lambda线程被创建了!~");});
            thread1.start();
    
        }
    }
    
2.2-Lambda表达式使用的前提
  • 有一个接口

  • 接口中有且只有一个抽象方法

    小案例

    使用lambda表达式调用自己创建的接口中的方法

    //定义一个接口,接口只有一个抽象方法
    public interface Eatable {
        void eat(String s);
    }
    
    /**
     * @author Object(object_hui@sina.com)
     * @description Eatable测试类
     * @date 2020/9/17
     */
    public class EatableDemo {
        public static void main(String[] args) {
            //使用Lambad 方法调用runEat()方法
            runEat((String s) - > {System.out.println("我喜欢吃"+s);});
        }
        
        public static void runEat(Eatable e){
            e.eat("西红柿炒蛋");
        }
    }
    
2.3-Lambda表达式的省略模式
  • 参数类型可以省略,但需要同时省略形参列表所有参数的参数类型

  • 如果参数只有一个,小括号可以省略不写

  • 如果代码块中只有一条语句,大括号和分号可以不写

  • 如果代码块中只有一个return语句,省略大括号和分号同时需要把return省略

//定义一个接口,接口只有一个抽象方法,只有一个参数,无返回值
public interface Eatable {
    void eat(String name);
}
//定义一个接口,接口只有一个抽象方法,2个参数,无返回值
public interface Eatable01 {
    void eat(String food,String name);
}

//定义一个接口,接口只有一个抽象方法,2个参数,有返回值
public interface Eatable02 {
    String eat(String food,String name);
}
/**
 * @author Object(object_hui@sina.com)
 * @description Eatable测试类
 * @date 2020/9/17
 */
public class EatableDemo {
    public static void main(String[] args) {
        //使用不省略 Lambad 方法调用runEat()方法
        runEat((String name) - > {System.out.println(name);});
    }
    //接口只有一个参数,小括号可以省略,只有一条语句,大括号和分号可以省略
    runEat( name - > System.out.println(name));
    }
	//接口只有多个参数,小括号不可以省略,只有一条语句,大括号和分号可以省略
    runEat( (food, name) - > System.out.println(name+food));
    }

	//接口只有多个参数,只有一条return语句,省略写法
    runEat( (food, name) - > name+food);
    }

    public static void runEat(Eatable e){
        e.eat("西红柿炒蛋");
    }
	 public static void runEat01(Eatable e){
        e.eat("西红柿炒蛋","张三");
    }
	public static String runEat02(Eatable e){
        e.eat("西红柿炒蛋","张三");
    }
}

3-Lambda与匿名内部类的区别

  • 内部类:通用,可以用于接口、抽象类、普通类的实现。

  • Lambda:只适用接口,并且接口中只能有一个抽象方法。

    案例:

    通过Lambda表达式获取接口对象,通过对象调用接口中的方法

//定义一个接口,接口只有一个抽象方法
public interface Eatable {
    void eat(String food);
}
/**
 * @author Object(object_hui@sina.com)
 * @description Eatable测试类
 * @date 2020/9/17
 */
public class EatableDemo {
    public static void main(String[] args) {
        //使用Lambad 先获取接口的对象
	Eatable e = (String food) -> {System.out.println("我喜欢吃"+food);};	
}
    //通过对象调用接口方法 
    e.eat("西红柿炒鸡蛋")
}
}  

4-Lambda支持引用的方法

4.1-常见的引用方式
  • 引用类方法:引用类中的静态方法

    格式:类名::静态方法名

    //接口,将字符串转换为int
    
    public interface ToInt {
        int change(String s);
    }
    
    /**
     * @author Object(object_hui@sina.com)
     * @description 字符串转int测试类
     * @date 2020/9/19
     */
    public class ToIntDemo {
        public static void main(String[] args) {
            //正常lambda写法
            runChange((String s) -> Integer.parseInt(s));
             //使用引用类型替代写法
            runChange(Integer::parseInt);
        }
    
        public static void runChange(ToInt ti){
            int num = ti.change("6666");
            System.out.println(num);
        }
    }
    
    
  • 引用对象的实例方法

    格式:对象名::成员方法名

    //接口,将字符串转换为int
    
    public interface ToInt {
        int change(String s);
    }
    
    /**
     * @author Object(object_hui@sina.com)
     * @description 实现字符串转数字方法的类
     * @date 2020/9/19
     */
    public class ToIntClass {
        public int toInt(String s){
            return Integer.parseInt(s);
        }
    }
    
    
    
    /**
     * @author Object(object_hui@sina.com)
     * @description 字符串转int测试类
     * @date 2020/9/19
     */
    public class ToIntDemo {
        public static void main(String[] args) {
            //正常lambda写法
            runChange((String s) -> Integer.parseInt(s));
            //使用对象引用实例方法替代lambda
            runChange(new ToIntClass()::toInt);
    
        }
    
        public static void runChange(ToInt ti){
            int num = ti.change("6666");
            System.out.println(num);
        }
    }
    
    
  • 引用类的实例方法:

    格式:类名::方法名

    public interface SubString {
        String subString(String str,int start, int end);
    }
    
    
    /**
     * @author Object(object_hui@sina.com)
     * @description 引用类的实例方法测试类
     * @date 2020/9/19
     */
    public class SubStringDemo {
        public static void main(String[] args) {
            //lambda表达式写法
            subStringTest((String str,int start,int end) -> str.substring(start,end));
            //采用了类的实例方法引用替代Lambda表达式
            subStringTest(String::substring);
        }
    
        public static void subStringTest(SubString s){
            System.out.println(s.subString("Hello World!~", 6, 11));
        }
    }
    
    
  • 引用构造方法

    格式:类名::new

    
    /**
     * @author Object(object_hui@sina.com)
     * @description 学生类
     * @date 2020/9/19
     */
    public class Student {
        private String name;
        private Integer age;
    
        public Student() {
        }
    
        public Student(String name, Integer age) {
            this.name = name;
            this.age = age;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public Integer getAge() {
            return age;
        }
    
        public void setAge(Integer age) {
            this.age = age;
        }
    
        @Override
        public String toString() {
            return "Student{" +
                    "name='" + name + '\'' +
                    ", age=" + age +
                    '}';
        }
    }
    
    
    /**
     *功能描述 创建学生类的接口
     * @author Object
     */
    
    public interface StudentBuild {
        Student bulidStudent(String name,Integer age);
    }
    
    
    
    /**
     * @author Object(object_hui@sina.com)
     * @description 引用构造方法替代lambda
     * @date 2020/9/19
     */
    public class StudentDemo {
        public static void main(String[] args) {
            //使用lambda表达式调用创建学生对象方法
            bulidStudent((String name,Integer age) -> new Student(name,age));
            //使用构造方法替代lambda表达式
            bulidStudent(Student::new);
    
        }
        private static void bulidStudent(StudentBuild sb){
            System.out.println(sb.bulidStudent("张三", 23));
        }
    }
    
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值