抛开其它看技术本身之lambda

前言

  • 如果你在别的教材上学习lambda感觉云里雾里,我相信,我这篇文章一定能为你解开心中所有疑惑。
  • 作者信息:网梦 QQ : 2756978088

lambda定义

  • lambda是应用在只有一个抽象方法的接口上一种表达式,其目的是为了简化匿名内部类。(关键词:只有一个抽象方法,针对接口)

先来看匿名内部类

  • 为了弄明白lambda表达式,先要明白什么是匿名内部类
  • 先定义一个接口 Message ,接口内有两个抽象方法 print()fun()
interface Message {
    void print() ;
    void fun() ;
}
  • 按照最初的方式,我们要使用这个接口,就必须要有一个类实现了这个接口,如下:
class MessageImpl implements Message {
    public void print() {
    System.out.println("Hello World !") ;
    }
    public void fun() {
    System.out.println("fun method") ;
    }
}
  • 在主方法中使用时,代码如下:
public class Hello {
    public static void main(String[] args) {
        Message msg = new MessageImpl() ;
        msg.print() ;
        msg.fun() ;
   }
}
  • 好了,现在来看匿名内部类上面为了使用接口里的方法,而特意建了一个类 MessageImpl ,这个类也没有扩充新方法,所以感觉有些多余,这时候就可以用匿名内部类来解决这个多余类的问题,代码如下:
public class Hello {
    public static void main(String[] args) {
        // 删除 多余的MessageImpl 类,直接使用匿名内部类
        Message msg = new Message() {
            public void print() {
                System.out.println("Hello World !") ;
            }
            public void fun() {
                System.out.println("fun method") ;
            }
        } ;
        msg.print() ;
        msg.fun() ;
   }
}
  • 以上代码省略了实现接口的类,直接在实例化时加了一个代码块,代码块里面覆写了接口中所有的抽象方法(可以是一个,也可以是多个)

回到lambda,简化匿名内部类

  • 内部类看起来实在是繁琐,为了使代码更elegance,lambda应运而生。lambda定义了,当接口中有且仅有一个抽象方法时,可以将匿名内部部的写法简化。
  • 先假设Message接口中只有一个print抽象方法
interface Message {
    void print() ;
}
  • 基于以上匿名内部类的讲解使用时是如下情况:
public class Hello {
    public static void main(String[] args) {
        Message msg = new Message() {
            public void print() {
                System.out.println("Hello World !") ;
            }
        } ;
        msg.print() ;
   }
}
  • 将匿名内部类部分代码拿出来,重点观察
Message msg = new Message() {
    public void print() {
        System.out.println("Hello World !") ;
    }
} ;
  • 用lambda表达式书写格式一:
Message msg = () -> {System.out.println("Hello World !")} ;
  • 用lambda表达式书写格式二:
Message msg = () -> System.out.println("Hello World !") ;

lambda 概念总结

  • 前提条件:lambda表达式 是针对只有一个抽像方法的接口。
  • 语法格式如下两种(一种有大括号{},一种没有大括号)
(参数) -> 表达式
(参数) -> {代码行;}
  • 参数:因为lambda针对的接口中只有一个抽象方法,所以这里的 (参数) 就对应这个抽象方法的参数。
  • (参数) -> 表达式 :如果覆写方法的代码只有一行代码的话,那就可以省略掉大括号{}而直接书写单行表达式即可。
  • (参数) -> 表达式 :如果覆写方法的代码只有一行代码 并且 有返回值时,不仅可以省略大括号,还可以省略return关键字。
  • (参数) -> {代码行;} :如果覆写方法的代码有行代码时,就不能省略大括号{}
  • (参数) -> {代码行;} :如果覆写方法的代码只有一行代码 并且 有返回值 并且 还想写return关键字的话,那就不能省略大括号{}
原文地址:https://www.cnblogs.com/haixianet/p/8607195.html