zoukankan      html  css  js  c++  java
  • Java基础00-Lamda表达式30

    1. Lambda表达式

    Java8新特征之Lambda表达式

    1.1 函数式编程思想概述

       

    1.2 体验Lambda表达式

      
    代码示例:

    方式一就不演示了,可以去看Java基础24

    方式2:
    匿名内部类的方式改进

    public class LambdaDemo {
        public static void main(String[] args) {
            // 匿名内部类的方式改进
            new Thread(new Runnable() {
    
                @Override
                public void run() {
                    System.out.println("多线程启动了!");
                }
            }).start();
        }
    }

    运行结果:

      

    方式3:
    Lambda表达式的方式改进

    public class LambdaDemo {
        public static void main(String[] args) {
            // Lambda表达式的方式改进
            new Thread(() -> {
                System.out.println("多线程启动了!");
            }).start();
        }
    }

    运行结果:

      
    1.3 Lambda表达式的标准格式

      

    两个方式做的是相同的事情,只不过Lambda表达式更加的简洁只做了我们要做的事情。

      

    使用该方式更加关注的是要做的事情。

    1.4 Lambda表达式的练习

      

    1.4.1 练习1( 抽象方法无参)

      
    代码示例:

    这里采用的是Lambda表达式接口的方式,还可以使用常规的方式实现接口中的方法,也可以使用匿名内部类,但是这是三种方式Lambda表达式是最简洁的。

    定义接口:

    //1:定义一个接口(Eatable),里面定义一个抽象方法: void eat();
    public interface Eatable {
        void eat();
    }

    创建实现类:

    //2:定义一一个测试类(EatableDemo),在测试类中提供两个方法
    public class EatableDemo {
        // 一个方法是主方法,在主方法中调用useEatable方法
        public static void main(String[] args) {
            // 调用useEatable方法
            // 使用Lambda表达式
            useEatable(() -> {
                System.out.println("一天一苹果,医生远离我");
            });
        }
    
        // 一个方法是: useEatable(Eatable e)
        public static void useEatable(Eatable e) {
            e.eat();
        }
    }

    运行结果:

      
    1.4.2 练习2(抽象方法有参)

       

    代码示例:

    定义接口:

    //1:定义一个接口(Flyable),里面定义一个抽象方法: void fly(String s);
    public interface Flyable {
        void fly(String s);
    }

    创建实现类:
    使用了匿名内部类和Lambda方式,两个方法。

    //2:定义一个测试类(FLyableDemo),在测试类中提供两个方法
    //一个方法是: useFlyable(Flyable f)
    //一个方法是主方法,在主方法中调用useFlyable方法
    public class FlyableDemo {
        public static void useFlyable(Flyable f) {
            f.fly("风和日丽,晴空万里");
        }
    
        private static void main(String[] args) {
            // 匿名内部类
            useFlyable(new Flyable() {
    
                @Override
                public void fly(String s) {    //这里的s是useFlyable方法定义的
                    System.out.println(s);
                    System.out.println("飞机自驾游");
                }
            });
            System.out.println("-------------------");
            // Lambda表达式
            useFlyable((String s) -> {
                System.out.println(s);
                System.out.println("飞机自驾游");
            });
        }
    }

    1.4.3 练习3(抽象方法有参有返回值)

      
    代码示例:

    定义接口:

    //1:定义一个接口(Addable),里面定义一个抽象方法: int add(int x, int y);
    public interface Addable {
        int add(int x, int y);
    }

    创建测试类:

    //2:定义一个测试类(AddableDemo),在测试类中提供两个方法
    //    一个方法是: useAddable(Addable a)
    //    一个方法是主方法,在主方法中调用useAddable方法
    public class AddableDemo {
    
        public static void main(String[] args) {
            useAddable((int x, int y) -> {
                return x + y;
            });
        }
    
        private static void useAddable(Addable a) {
            int add = a.add(10, 20);
            System.out.println(add);
        }
    }

    运行结果:

      
    1.5 Lambda表达式的省略模式

      

    代码示例:

    Addable接口,int类型有参有返回值

    public interface Addable {
        int add(int x, int y);
    }

    Flyable接口,String类型有参无返回值

    public interface Flyable {
        void fly(String s);
    }

    测试类:

    public class LambdaDemo {
        public static void main(String[] args) {
            // 在这里只使用Lambda方式
    
            // useAddable(Addable a)方法
            // 常规方式
            useAddable((int x, int y) -> {
                return x + y;
            });
            // 参数的类型可以省略,但是有多个参数的情况下不能就省略一个
            useAddable((x, y) -> {
                return x + y;
            });
            System.out.println("----------------------");
            // useFlyable(Flyable f)方法
            // 常规方法
            useFlyable((String s) -> {
                System.out.println(s);
            });
            // 省略参数类型
            useFlyable((s) -> {
                System.out.println(s);
            });
            // 如果代码块的语句只有一条,可以省略大括号和分号
            useFlyable(s -> System.out.println(s));
            // 如果代码块的语句只有一条,可以省略大括号和分号,如果有return,return也要省略掉
            useAddable((x, y) -> x + y);
        }
    
        private static void useFlyable(Flyable f) {
            f.fly("风和日丽,晴天万里");
        }
    
        private static void useAddable(Addable a) {
            int i = a.add(10, 20);
            System.out.println(i);
        }
    }

    运行结果:
    方法都可以正常运行

      
    1.6 Lambda表达式的注意事项

         

    public class LambdaDemo01 {
        public static void main(String[] args) {
    
            // 这样写是会报错的,因为没有上下文环境
    //        () -> System.out.println("Lambda表达式");
    
            // 必须有上下文环境,才能推导出Lambda对应的接口
            // 根据局部变量的赋值得知L ambda对应的接口:
            Runnable r = () -> System.out.println("Lambda表达式");
            // 根据调用方法的参数得知L ambda对应的接口:
            new Thread(() -> System.out.println("Lambda表达式")).start();
        }
    }

    1.7 Lambda表达式和匿名内部类的区别

    Lambda表达式:只能是接口

       

  • 相关阅读:
    PAT (Basic Level) Practise 1013 数素数
    PAT (Basic Level) Practise 1014 福尔摩斯的约会
    codeforces 814B.An express train to reveries 解题报告
    KMP算法
    rsync工具
    codeforces 777C.Alyona and Spreadsheet 解题报告
    codeforces 798C.Mike and gcd problem 解题报告
    nginx + tomcat多实例
    MongoDB副本集
    指针的艺术(转载)
  • 原文地址:https://www.cnblogs.com/ajing2018/p/14684722.html
Copyright © 2011-2022 走看看