Java8Lambda表达式

Java8Lambda表达式

java8提供的函数一些接口

package java.util.function;

Lambda表达式

  • 一种运算符
  • 表示匿名函数和闭包

为什么需要用Lambda表达式

  • 在Java中,我们无法将函数作为参数传递给一个方法,也无法申明返回一个函数的方法
  • 在javaScript中,函数参数是一个函数,返回值是另外一个函数的情况是非常常见的;JavaScript是一门非常典型的函数式语言

Lambda表达是的基本结构

  • 用swing定义一个按钮,然后点击按钮触发事件
// java8之前的写法
 public static void main(String[] args) {

        JFrame jFrame = new JFrame("My JFrame");
        JButton jButton = new JButton("My JButton");

        jButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                System.out.println("Button Pressed!");
            }
        });
        
        jFrame.add(jButton);
        jFrame.pack();
        jFrame.setVisible(true);
        jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        
 }

以上这种写法在添加事件的用匿名内部类的方式实现

我们目的只是为了打印

System.out.println("Button Pressed!");

实际上我们做了以下的事情

  1. 申明ActionListener的匿名类
  2. 然后重写actionPerformed(ActionEvent e)方法
  3. 最后调用到这个方法打印System.out.println("Button Pressed!");
  • Lambda表达式的写法
 public static void main(String[] args) {

        JFrame jFrame = new JFrame("My JFrame");
        JButton jButton = new JButton("My JButton");

        jButton.addActionListener(e -> System.out.println("Button Pressed!"));

        jFrame.add(jButton);
        jFrame.pack();
        jFrame.setVisible(true);
        jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

 }

Lambda表达式的写法清晰的表达,给Button添加一个事件就是打印System.out.println("Button Pressed!");

  • Lambda表达式结构
(param1,param2,param3) -> {
  ...
}

java8 开始 interface中可以有具体实现的方法

* <p>Note that instances of functional interfaces can be created with
* lambda expressions, method references, or constructor references.

关于函数式接口:

  • 如果一个接口只有一个抽象方法,那么该接口就是一个函数式接口
  • 如果我们在某个接口上声明了FunctionalInterface注解,那么编译器就会按照函数式接口的定义来要求该接口
  • 如果某个接口只有一个抽象方法,但我们并没有给该接口声明FuncationalInterface注解,那么编译器依旧会将该接口看作是函数式接口.

Lambda表达式的作用

  • Lambda表达式为java添加了缺失的函数式编程的特性,是我们能将函数式当作一等公民来实现
  • 在函数式作为一等公民的语言中,Lambda表达式的类型是函数,但在java中,Lambda表达式是对象,他们必须依附于一类特别的对象类型-函数式接口(funcational interface)
  • 传递行为,而不仅仅是值
    • 提升抽象层次
    • API重用性更好
    • 更加灵活

Lambda

  • 语法:(argument) -> {body}
    • Eg.
      • (arg1,arg2)-> {body}
      • (Type1 arg1,Typ2, arg2) -> {body}
  • 结构
    • 一个Lambda表达式可以有零个或者多个参数
    • 参数的类型即可以明确声明也可以根据上下文来推断
    • 所有参数需要包含在圆括号内,参数之间用逗号相隔
    • 空阔号代表参数集为空
    • 当只有一个参数,其类型可以推导时,圆括号可以省略
    • Lambda表达式的主题可以包含0条或者多条语句
    • 如果Lambda表达式的主题只有一条语句,花括号可以了省略
    • 如果Lambda表达式的主题包含一条以上语句,则表达式必须包含在代码块内
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值