哈喽,大家好,我是指北君。

虽然目前Java最新版本都已经到16了,但是绝大部分公司目前用的Java版本都是8,想当初Java8问世后,其Lambda表达式与方法引用可是最亮眼的新特性,目前,这两个特性也被大家广泛使用,所以今天指北君就带大家看看这两个特性

1.Lambda

从JDK1.8开始为了简化使用者进行代码开发,专门提供有Lambda表达式的支持,利用此操作形式可以实现函数式的编程,对于函数式编程比较著名的语言:haskell,Scala,利用函数式的编程可以避免掉面向对象编程之中的一些繁琐的问题。 面向对象在其长期发展的过程中一直有一部分的反对者认为面向对象过于繁琐

比如:

public interface IMessage {
    public void send(String str);
}
public class Demo {
    public static void  main(String args[]){
        IMessage msg = new IMessage() {
            @Override
            public void send(String str) {
                System.out.println("消息发送:"+str);
            }
        };
        msg.send("hahahaha");
    }
}

上面语句的核心功能只有一行核心语句,但是为了这一行核心语句依然需要按照完整的面向对象给出的设计结构进行开发。所以Lambda出现啦。

public interface IMessage {
    public void send(String str);
}
public class Demo {
    public static void  main(String args[]){
       IMessage msg = (str)->{
           System.out.println("发送消息:"+str);
       };
        msg.send("hahahaha");
    }
}

简单吧,这种形式就避免了复杂的面向对象结构化的要求。

Lambda表达式如果要想使用,那么必须有一个重要的实现要求:SAM(Single Abstract Method)只有一个抽象方法(但可以有default和static方法),以IMessage接口为例,在这个接口里面发现只是提供有一个send()方法,除此之外没有任何其他方法定义,所以这样的接口就被称为函数式接口,而只有函数式接口才可以被Lambda表达式所使用

jdk1.8之后可以在接口里面定义static方法和default方法也是为了函数式编程而设置的,如下面这个是允许的

public interface IMessage {
    public void send(String str);
    public default void defaultMethod(){
        System.out.println("hahahaha");
    };

}
public class Demo {
    public static void  main(String args[]){
       IMessage msg = (str)->{
           System.out.println("发送消息:"+str);
       };
        msg.send("hahahaha");
        msg.defaultMethod();
    }
}

对于Lambda表达式而言,提供了如下几种格式

1) 方法没有参数:()-->{ };

2) 方法有参数:(参数,参数)-->{ };

  1. 如果现在只有一行语句返回:(参数,参数)-->语句;

我们看下第三种

public interface IMath {
    public int add(int x,int y);
}
public class Demo {
    public static void  main(String args[]){
       IMath math = (t1,t2) -> t1 + t2;
        System.out.println(math.add(10,20));
    }
}

利用Lambda表达式可以使代码更加简便

其中一个很经典的应用就是多线程Runnable接口的例子

public class Test{
    public static void main(String[] args) {
        /*
        匿名内部类的方式
        new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("nihao");
            }
        }).start();
        System.out.println("你好");
        
        */
        
        
        //lambda的方式
        new Thread(()-> {
            for(int i = 1 ; i<100 ; i++){
                System.out.println("It is a lambda function!");
            }

        }).start();

    }
}

2.方法引用

引用数据类型最大的特点是可以进行内存的指向处理,但是在传统的开发之中一直所使用的只是对象引用操作,而jdk1.8以后也提供有方法的引用,即:不同的方法名称可以描述同一个方法(即可以为一个方法定义多个名字,但是要求必须是函数式接口)。如果要进行方法的引用在java里面提供了如下的四种形式

1)引用静态方法: 类名称 :: static方法名称;

2)引用某个实例对象的方法: 实例化对象 :: 普通方法;

3)引用特定类型的方法: 特定类 :: 普通方法;

4)引用构造方法: 类名称 :: new ;

2.1 引用静态方法

在String类里面提供有String.valueOf( )方法,这个方法就属于静态方法。

方法范例:public static String valueOf(int i),该方法有参数还有返回值

@FunctionalInterface  //函数式接口
public interface IFunction<P,R> {
    public R change(P p);      //p描述的是参数,R描述的是返回值
}
public class Demo {
    public static void  main(String args[]){

        IFunction<Integer , String > fun = String :: valueOf;
        String str = fun.change(100);
        System.out.println(str.length());
    }
}

输出结果为:3

2.2 引用某个实例对象的方法

String类里面有个转大写的方法: public String toUpperCase( )

这个方法是必须在有实例化对象提供的情况下才可以调用

@FunctionalInterface  //函数式接口
public interface IFunction<R> {
    public R upper();
}
public class Demo {
    public static void  main(String args[]){

        IFunction<String> fun = "hahaha" :: toUpperCase;    //"hahaha"为String的实例化对象
        System.out.println(fun.upper());
    }
}

输出结果为:hahaha

2.3 引用特定类型的方法

在方法引用时也可以引用特定类中的一些操作方法,在String里面提供有一个字符串大小关系的比较

比较大小:public int compareTo(String anotherString)

这是一个普通方法,如果要引用普通方法,则往往都需要实例化对象,但是如果说现在你不想给出实例化对象,只是想引用这个方法,则就可以使用特定类来进行引用处理。

@FunctionalInterface  //函数式接口
public interface IFunction<P> {
    public int compare(P p1,P p2);
}
public class Demo {
    public static void  main(String args[]){

        IFunction<String> fun = String :: compareTo ;    //String类中的conpareTo方法
        System.out.println(fun.compare("A","a"));
    }
}

输出结果为:-34

2.4 引用构造方法

public class Person {
    private String name;
    private int age;
    public Person(String name,int age){
        this.name = name;
        this.age = age;
    }
    public String toString(){
        return "姓名:" + this.name + "、年级:" + this.age ;
    }
}
@FunctionalInterface  //函数式接口
public interface IFunction<R> {
    public R create(String s ,int a);
}
public class Demo {
    public static void  main(String args[]){

        IFunction<Person> fun = Person :: new ;    //String类中的conpareTo方法
        System.out.println(fun.create("张三",20));
    }
}

输出结果:姓名:张三、年级:20

提供方法引用的概念更多情况下也只是弥补了对于引用的支持功能。

3 小结

本文介绍了Java8的新特性,lambda和方法引用,其为我们编程带来了便利,所以我们应该需要掌握它。

我是指北君,操千曲而后晓声,观千剑而后识器。感谢各位人才的:点赞、收藏和评论,我们下期更精彩!

lambda与方法引用的更多相关文章

  1. 深入理解Java 8 Lambda(语言篇——lambda,方法引用,目标类型和默认方法)

    作者:Lucida 微博:@peng_gong 豆瓣:@figure9 原文链接:http://zh.lucida.me/blog/java-8-lambdas-insideout-language- ...

  2. [转]深入理解Java 8 Lambda(语言篇——lambda,方法引用,目标类型和默认方法)

    以下内容转自: 作者:Lucida 微博:@peng_gong 豆瓣:@figure9 原文链接:http://zh.lucida.me/blog/java-8-lambdas-insideout-l ...

  3. Java8特性之Lambda、方法引用以及Stream流

    Java 8 中的 Streams API 详解:https://www.ibm.com/developerworks/cn/java/j-lo-java8streamapi/ Java笔记——Jav ...

  4. 函数式接口 & lambda表达式 & 方法引用

    拉呱: 终于,学习jdk8的新特性了,初体验带给我的感觉真爽,代码精简的不行,可读性也很好,而且,spring5也是把jdk8的融入到血液里,总之一句话吧,说的打趣一点,学的时候自己难受,学完了写出来 ...

  5. Java笔记——Java8特性之Lambda、方法引用和Streams

    Java8已经推出了好一段时间了,而掌握Java8的新特性也是必要的,如果要进行Spring开发,那么可以发现Spring的官网已经全部使用Java8来编写示例代码了,所以,不学就看不懂. 这里涉及三 ...

  6. Java8特性之Lambda、方法引用和Streams

    这里涉及三个重要特性: Lambda 方法引用 Streams ① Lambda 最早了解Lambda是在C#中,而从Java8开始,Lambda也成为了新的特性,而这个新的特性的目的,就是为了消除单 ...

  7. Lambda学习---方法引用和其他基本应用

    package com.zx; import java.util.*; import java.util.function.*; import java.util.stream.Collectors; ...

  8. java8之lambda表达式&方法引用(一)

    本文将简单的介绍一下Lambda表达式和方法引用,这也是Java8的重要更新,Lambda表达式和方法引用最主要的功能是为流(专门负责迭代数据的集合)服务. 什么是lambda表达式 可以把lambd ...

  9. 黑马Lambda表达式学习 Stream流 函数式接口 Lambda表达式 方法引用

随机推荐

  1. 让Angular自定义组件支持form表单验证

    Angular提供了一套非常强大的表单验证库(vue和react都需要第三方库的支持),可以非常方便简单实现web应用程序中的表单验证功能.但是如何让我们自定义的组件也支持验证呢? 我遇到一个需求是封 ...

  2. 记一次 .NET 某云采购平台API 挂死分析

    一:背景 1. 讲故事 大概有两个月没写博客了,关注我的朋友应该知道我最近都把精力花在了星球,这两个月时间也陆陆续续的有朋友求助如何分析dump,有些朋友太客气了,给了大大的红包,哈哈,手里面也攒了1 ...

  3. Python -- raw_input函数

    使用raw_input函数,它会把所有的输入当作原始数据(raw data),然后将其放入字符串中: >>> input("Enter a number: ") ...

  4. RegisterClass/RegisterClassEx -- 注册窗口类

    (1)函数原型 1 //RegisterClass 2 ATOM RegisterClass( 3 const WNDCLASS * lpWndClass //Long pointer to a WN ...

  5. 基于Redisson实现分布式锁源码解读

    文章目录 一.分布式锁的概念 和 使用场景 二.将redis官网对于分布式锁(红锁)的定义和Redisson实现做概括性总结 三.基于Redisson的分布式实现方案 四.加锁过程分析 五.锁重入过程 ...

  6. 以两种异步模型应用案例,深度解析Future接口

    摘要:本文以实际案例的形式分析了两种异步模型,并从源码角度深度解析Future接口和FutureTask类. 本文分享自华为云社区<[精通高并发系列]两种异步模型与深度解析Future接口(一) ...

  7. 痞子衡嵌入式:深扒i.MXRTxxx系列ROM中集成的串行NOR Flash启动SW Reset功能及其应用场合

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是i.MXRTxxx系列ROM中集成的串行NOR Flash启动SW Reset功能及其应用场合. 在串行 NOR Flash 热启动过程 ...

  8. winform制作简易屏幕保护工具

    效果如下: 具体实现代码如下: using System; using System.Collections.Generic; using System.ComponentModel; using S ...

  9. Spring-初见

    目录 组成 Spring Boot与Spring Cloud IOC DI 1.常量注入 2.Bean注入 3.Properties注入 p命名和c命名注入 Bean Singleton Protot ...

  10. ClickHouse与ES的优劣对比

    优点: ClickHouse写入吞吐量大,单服务器日志写入量在50MB到200MB/s,每秒写入超过60w记录数,是ES的5倍以上. 查询速度快,官方宣称数据在pagecache中,单服务器查询速率大 ...