java8新特性(二)_lambda表达式

时间:2022-09-22 08:10:32

最近一直找java8相关新特性的文章,发现都太没有一个连贯性,毕竟大家写博客肯定都有自己的侧重点,这里找到一本书,专门介绍java8新特性的,感觉大家可以看看《写给大忙人看的JavaSE8》.这里我会结合书中的知识以及网上的知识,对于java8 的新特性进行总结,当然我自己写的也会有自己的侧重点。

java8为什么增加了函数式编程

java作为一门面向对象的编程语言诞生于20世纪90年代。在当时,面向对象编程是软件开发的主流模式。

由于最近在并发和事件驱动(或者称为“互动”)编程中的优势,函数式编程又逐渐变得重要起来。

这并不意味着面向对象编程不好,相反,最终的趋势是将面向对象编程和函数编程结合起来。

java8主要在原来面向对象的基础上增加了函数式编程的能力.

函数式编程的语言我就了解过一个_Erlang,有兴趣的大家可以看看Erlang这门语言。比如消息中间件rabbitmq 就是采用erlang写的。只要用过erlang的一定知道坚强2002和阿里的余锋。还有再推荐一个博客为“没有开花的树”的博主。至少对我帮助蛮多的。(有点扯远了)

为什么要使用lambda表达式

lambda表达式的定义

lambda表达式是一段可以传递的代码,因此它可以被执行一次或者多次。

实战代码对比

之前我们要在另一个独立线程中执行一些逻辑时,通常会将代码放到一个实现Runnable接口的类的run方法中。如下面

public class Worker implements Runnable {
@Override
public void run() {
for (int i = 0; i < 1000; i++) {
System.out.println("doWork" + i);
}
}
}

执行代码

    public static void main(String[] args) {
Worker worker = new Worker();
new Thread(worker).start(); }

这段代码的关键在于,run方法中包含了你希望在另一个线程中需要执行的代码。

到现在为止,在java 中向其他代码传递一段代码并不是很容易的。你不得不构建一个属于某个类的对象,由它的某个方法来包含所需的代码。

我们看看使用lambda表达式重写上面的方法

        new Thread(() -> {
for (int i = 0; i < 1000; i++) {
System.out.println("doWork" + i);
}
}).start();

lambda表达式语法

一般语法

(Type1 param1,Type2 params,...) -> {

    statment1;
statment2;
.....
return statmentM; }

单参数语法

可以省略前面的小括号,但是我一般都是带着

param1 ->{
...
...
return ...;
}

单语句语法

可以省略后面的大括号

param1 -> statment

函数式接口

在java中有许多已有的接口都需要封装代码块,如Runnable。lambda表达式与这些接口都是向后兼容的。

对于只包含一个抽象方法的接口,你可以通过lambda表达式来创建该接口的对象。这种接口被称为函数式接口。

这里注意一点,大家都知道接口中的方法是抽象的。事实上,接口经常会重新声明Object类中的方法。如toString等 这些方法命名并不是抽象的。

我们看下Runnable的代码 源码

@FunctionalInterface
public interface Runnable {
/**
* When an object implementing interface <code>Runnable</code> is used
* to create a thread, starting the thread causes the object's
* <code>run</code> method to be called in that separately executing
* thread.
* <p>
* The general contract of the method <code>run</code> is that it may
* take any action whatsoever.
*
* @see java.lang.Thread#run()
*/
public abstract void run();
}

注意有个@FunctionalInterface 注解,有2个作用

  • 编译器会检查标注该注解的实体,检查它是否是只包含一个抽象方法的接口。
  • 在jacadoc页面也会包含一条声明,说明这个接口是一个函数式接口。

但是这个注解并不是强制使用,从概念上讲,所有只含有一个抽象方法的接口都是函数式接口,但是使用@FunctionalInterface 注解会让你的代码更加清楚,毕竟代码的可读性是编程的第一规范。

方法引用

有时候,你想要传递给其他代码的操作已经有实现的方法。

Class or instance :: method

比如

(x) ->  System.out.println(x);

就等同于

 System.out::println;

构造器引用

  • 构造器引用同方法引用类似,不同的是在构造器引用中方法名是 new.

  • 对于拥有多个构造器的类,选择使用哪个构造器取决于上下文

Class :: new

变量作用域

外部变量在 lambda 表达式引用时,jdk 8 编译器会隐式做为 final 来处理

转自:https://www.cnblogs.com/zhenghengbin/p/9418961.html

java8新特性(二)_lambda表达式的更多相关文章

  1. java8新特性: lambda表达式:直接获得某个list&sol;array&sol;对象里面的字段集合

    java8新特性: lambda表达式:直接获得某个list/array/对象里面的字段集合 比如,我有一张表: entity Category.java service CategoryServic ...

  2. Java8 新特性学习 Lambda表达式 和 Stream 用法案例

    Java8 新特性学习 Lambda表达式 和 Stream 用法案例 学习参考文章: https://www.cnblogs.com/coprince/p/8692972.html 1.使用lamb ...

  3. Java8新特性之Lambda表达式

    lambda表达式是java8给我们带来的几个重量级新特性之一,借用lambda表达式,可以让我们的java程序设计更加简洁.最近新的项目摒弃了1.6的版本,全面基于java8进行开发,本文是java ...

  4. Java8 新特性之Lambda表达式

    1. Lambda 表达式概述 Lambda 是一个匿名函数,我们可以把 Lambda 表达式理解为是一段可以传递的代码(将代码像数据一样进行传递); Lambda 表达式可以写出更简洁,更灵活的代码 ...

  5. 【Java8新特性】Lambda表达式基础语法,都在这儿了!!

    写在前面 前面积极响应读者的需求,写了两篇Java新特性的文章.有小伙伴留言说:感觉Lambda表达式很强大啊!一行代码就能够搞定那么多功能!我想学习下Lambda表达式的语法,可以吗?我的回答是:没 ...

  6. 夯实Java基础(二十二)——Java8新特性之Lambda表达式

    1.前言 Java 8于14年发布到现在已经有5年时间了,经过时间的磨练,毫无疑问,Java 8是继Java 5(发布于2004年)之后的又一个非常最重要的版本.因为Java 8里面出现了非常多新的特 ...

  7. java8新特性之——lambda表达式的使用

    lambda表达式简介 个人理解,lambda表达式就是一种新的语法,没有什么新奇的,简化了开发者的编码,其实底层还是一些常规的代码.Lambda 是一个匿名函数,我们可以把 Lambda 表达式理解 ...

  8. Java8 新特性&lpar;一&rpar;- Lambda 表达式

    2014年3月18日发布了JavaSE 8 不追求技术的新,追求技术的稳定 本质:Lambda 表达式是一个匿名函数 作用:简化代码,增强代码的表达力 Lambda 语法格式 // 格式1:无参无返回 ...

  9. Java8 新特性&lpar;二&rpar;- Stream

    Stream 用来处理集合数据的,通过 stream 操作可以实现 SQL 的拥有的大部分查询功能 Java8 API 官方文档 下面借助例子,演示 stream 操作 Java userList 列 ...

  10. 乐字节-Java8新特性-Lambda表达式

    上一篇文章我们了解了Java8新特性-接口默认方法,接下来我们聊一聊Java8新特性之Lambda表达式. Lambda表达式(也称为闭包),它允许我们将函数当成参数传递给某个方法,或者把代码本身当作 ...

随机推荐

  1. 关于手机的内置SD卡与外置SD卡

    对于安卓2.3的系统来说,Environment.getExternalStorageDirectory()获取的目录是内置SD卡还是外置SD卡是无法保证的, 和手机厂商的修改有关,只能通过Envir ...

  2. 深入剖析 redis RDB 持久化策略

    简介 redis 持久化 RDB.AOF redis 提供两种持久化方式:RDB 和 AOF.redis 允许两者结合,也允许两者同时关闭. RDB 可以定时备份内存中的数据集.服务器启动的时候,可以 ...

  3. PHP上传文件出现文件名被截掉第一个字符的问题

    最近用PHP做了一个简单的上传功能,结果出现了一个意想不到的问题.我上传的文件,在获取$_FILES的时候发现文件名的第一个字符被截掉了,因为最开始上传的一直是数字或者字母为名称的文档,也没有太在意这 ...

  4. 【代码优化】当许多构造函数的参数,请考虑使用builder模式

    静态工厂和构造具有共同的局限性:我们不能扩展到大量的非常好的可选参数. 1.对于多个可选參数的构造器.我们都习惯採用重叠构造器模式.比方一个參数的构造器调用2个參数的构造器.     2个參数的构造器 ...

  5. HTTP基础知识(一)

    一.了解web及网络基础 1.通过发送请求获取服务器资源的web浏览器等的都可称为客户端(client) 2.HTTP:HyperText Transfer Protocol,超文本传输协议:所有的W ...

  6. JAVA程序员成长历程(一)

    程序员的20个常见瓶颈 在扩展性的艺术一书中,Russell给出了20个有意思的估计:大约有20个经典瓶颈. Russell说,如果在他年轻时他就知道这些瓶颈该有多好!这些论断包括: * Databa ...

  7. d4d&num;9 玩Docker只要浏览器就够了,PWD是个神奇的网站

    本文是d4d系列的第9篇,在这一篇中给大家介绍一个学习Docker最为快捷高效的方式,你不需要自己搭建环境,也不用担心把自己的开发环境搞乱,你需要的只是一个浏览器,就可以立即开始学习Docker的常用 ...

  8. 初始docker

    什么是docker? 很多人都是使用docker但是对docker的理解其实并没有这么透彻,只知道怎么用但是不知道为什么用 什么时候去用. 一.环境配置的难题 软件开发最大的麻烦事之一,就是环境配置. ...

  9. MySQL5&period;7之多源复制&amp&semi;Nginx中间件(下)【转】

    有生之年系列----MySQL5.7之多源复制&Nginx中间件(下)-wangwenan6-ITPUB博客http://blog.itpub.net/29510932/viewspace-1 ...

  10. Oracle查询一个表的数据插入到另一个表

    1. 新增一个表,通过另一个表的结构和数据 create table XTHAME.tab1 as select * from DSKNOW.COMBDVERSION 2. 如果表存在: insert ...