首页 > 编程语言 >JAVA Lambda表达式

JAVA Lambda表达式

时间:2022-09-18 17:59:12浏览次数:77  
标签:JAVA void System println Lambda public 表达式 out

JAVA Lambda表达式

函数式

  • 在数学中,函数就是有输入量,输出量的一套计算方案,也就是拿数据做操作

  • 面向对象思想强调“必须通过对象形式来做事情”

  • 函数式思想则尽量忽略面向对象的复杂语法:“强调做什么,而不是以什么形式去做”

  • Lambda表达式就是函数式思想的体现

Lambda表达式的标准格式

Lambda表达式的格式

  • 格式:(形式参数) - > {代码块}

  • 形式参数:如果有多个参数,参数之间用逗号隔开,如果没有参数,留空即可

  • ->:又英文画线和大于符号组成,固定写法,表示指向动作

  • 代码块,是我们具体要做的事,也就是以前我们写的方法体内容

Lambda表达式练习1(抽象方法无参无返回值)

Lambda表达式的使用前提

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

接口Eatable

public interface Eatable {
    void eat();
}

接口Eatable的实现类

public class Eatablelmpl implements Eatable{
    @Override
    public void eat() {
        System.out.println("吃午饭");
    }
}

main操作类

   public static void main(String[] args) {
        //在主方法中调用方法
        Eatable e = new Eatablelmpl();
        useEatable(e);

        //匿名内部类
        useEatable(new Eatablelmpl(){
            @Override
            public void eat() {
                System.out.println("一天一苹果");
            }
        });

        //Lambda表达式
        useEatable(()->{
            System.out.println("今天吃苹果");
        });
    }

    private static void useEatable(Eatable e){
        e.eat();
    }
}

Lambda表达式练习2(抽象方法带参无返回值)

Flyable接口

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

main方法类

    public static void main(String[] args) {
        //匿名内部类
        useFlyable(new Flyable() {
            @Override
            public void fly(String s) {
                System.out.println(s);
                System.out.println("nihao");
            }
        });
        System.out.println("---------");

        //Lambda表达式
        useFlyable((String s)->{
            System.out.println(s);
            System.out.println("hello");
        });
    }

    private static void useFlyable(Flyable f) {
        f.fly("ooooo");
    }

}

Lambda表达式练习3(抽象方法带参带返回值)

Addable接口

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

Addabledemo测试类

   public static void main(String[] args) {
        //匿名内部类
        useAddable(new Addable() {
            @Override
            public int add(int x, int y) {
                return x + y;
            }
        });
        //Lambda表达式
        useAddable((int x, int y) -> {
            return x + y + x;
        });
    }

    private static void useAddable(Addable a) {
        int sum = a.add(1, 2);
        System.out.println(sum);
    }
}

Lambda表达式的省略模式

省略规则

  • 参数类型可以省略,但是有多个参数类型的情况下,不能只省略一个
  • 如果参数有且仅有一个,那么小括号可以省略
  • 如果代码块的语句只有一句,可以省略大括号和分号,甚至是return

2个测试接口

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

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

测试Demo

    public static void main(String[] args) {
        useAddable((int x, int y) -> {
            return x + y;
        });
        //Lambda参数的类型可以省略
        useAddable((x, y) -> {
            return x + y;
        });
        //但是有多个参数的情况下不能只省略一个,要不不省略要不都省略

        //同理以下也可以省略
        useFlyable((String s) -> {
            System.out.println(s);
        });
        useFlyable((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 sum = a.add(1, 2);
        System.out.println(sum);
    }
}

Lambda的注意事项

  • 使用Lambda表达式,并且要有接口且仅有一个抽象方法
  • 必须有上下文环境,才能推导出Lambda对应的接口
    • 根据局部变量的赋值得知Lambda对应的接口:Runnable r = () -> System.out.println("hello");
    • 根据调用自身方法的参数得知Lambda对应的接口:new Thread(() -> System.out.println("hello")).start();
public interface Inter {
    void show();
}



 public static void main(String[] args) {
//        useShow(()->{
//            System.out.println("你好");
//        });

        //使用Lambda表达式,并且要有接口且仅有一个抽象方法
        useShow(() -> System.out.println("你好"));

        //必须有上下文环境,才能推导出Lambda对应的接口
        new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("hello");
            }
        }).start();
        //以Lambda表达式的方式如下
        Runnable r = () -> System.out.println("hello");
        new Thread(r).start();
        //或者
        new Thread(() -> System.out.println("hello")).start();
        //Lambda 和 匿名内部类 都代表一个接口的匿名实现
    }

    private static void useShow(Inter i) {
        i.show();
    }
}

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

标签:JAVA,void,System,println,Lambda,public,表达式,out
From: https://www.cnblogs.com/joeximu/p/16705321.html

相关文章