Lamda的深入认知(一)

基础及原理分析

一、 需求

  1. 我们越来越需要: 将行为进行参数化,在方法间进行传递。
  2. 但是JDK7 之前的世界:方法是不能够做为“一等公民”进行传递的(反射机制可以做到,但远没有达到目的)。
  3. 我们需要新的东西,来完成将“行为参数化”的使命(JDK5 完成了将“参数类型参数化”,JDK1时代完成“参数名称参数化”)!

二、实现的过程(原理):

1、规定了新型的语法来表示“方法对象”(实际它是一个接口的匿名内部类的实例)

lamdaObj=(Object obj,String str)->{
 //处理逻辑
//return 数据
}

你目前可以理解为:这是实例化对象的又一种方法(语法糖)!

  1. 那么lamdaObj的类型是什么?
    (1)JDK8并没有因此而引入新的类(实际上它引入一些新的类如:Predicate,但这并不是基于为lamda引入类型的需求)
    (2)缔造者提出了一个新的概念“函数式接口”,并为此类接口引入了一个新的注解(@FunctionalInterface),以帮助编译器检查。这个接口只有一个抽象方法(JDK8中引入了默认方法,并不会影响它的定义),这样JDK8之前的如:Runnable,Callable,Comparable等接口都有一个新别名,函数式接口
    (3) 这样我们可以用函数式接口去声明lamda,代码如下:
interface MyInterface{
    boolean fn(Object obj,String str);
}
MyInterface lamdaObj=(Object obj,String str)->{
 //处理逻辑
//return 数据
}

引起注意的是:

  • MyInterface中fn方法名称并不重要了
  • Object,String这两个参数类型是以省略的(编译器的自动推断功能)

最后代码可以做出如下的简化:

//型别推断
MyInterface lamdaObj=(obj,s)->true;
interface  MyInterface{
  boolean fn(Object obj,String str);
}

三、得出结论:

凡是声明为“函数式接口”类型的引用,我们都可以使用Lamda进行替换!
简单的测试例子:

public class Demo02 {
    public static void main(String... args) {
        //测试传入Lamda
        method1((Object obj,String str)->true);
        //测试返回
        method2().fn(new Object(),"abc");
    }
    //传入Lamda
    public static void method1(MyInterface myInterface){
        myInterface.fn(new Object(),"abc");
    }
    //返回Lamda
    public static MyInterface method2(){
        return (Object obj,String str)->true;
    }
    interface  MyInterface{
        boolean fn(Object obj,String str);
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 注:之前关于Java8的认知一直停留在知道有哪些修改和新的API上,对Lambda的认识也是仅仅限于对匿名内部类的...
    mualex阅读 2,875评论 1 4
  • 这是16年5月份编辑的一份比较杂乱适合自己观看的学习记录文档,今天18年5月份再次想写文章,发现简书还为我保存起的...
    Jenaral阅读 2,910评论 2 9
  • Java8 in action 没有共享的可变数据,将方法和函数即代码传递给其他方法的能力就是我们平常所说的函数式...
    铁牛很铁阅读 1,286评论 1 2
  • 国家电网公司企业标准(Q/GDW)- 面向对象的用电信息数据交换协议 - 报批稿:20170802 前言: 排版 ...
    庭说阅读 11,308评论 6 13
  • 第3章 基本概念 3.1 语法 3.2 关键字和保留字 3.3 变量 3.4 数据类型 5种简单数据类型:Unde...
    RickCole阅读 5,281评论 0 21