java8新特性(二)_lambda表达式
最近一直找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表达式的更多相关文章
- java8新特性: lambda表达式:直接获得某个list/array/对象里面的字段集合
		java8新特性: lambda表达式:直接获得某个list/array/对象里面的字段集合 比如,我有一张表: entity Category.java service CategoryServic ... 
- Java8 新特性学习 Lambda表达式 和 Stream 用法案例
		Java8 新特性学习 Lambda表达式 和 Stream 用法案例 学习参考文章: https://www.cnblogs.com/coprince/p/8692972.html 1.使用lamb ... 
- Java8新特性之Lambda表达式
		lambda表达式是java8给我们带来的几个重量级新特性之一,借用lambda表达式,可以让我们的java程序设计更加简洁.最近新的项目摒弃了1.6的版本,全面基于java8进行开发,本文是java ... 
- Java8 新特性之Lambda表达式
		1. Lambda 表达式概述 Lambda 是一个匿名函数,我们可以把 Lambda 表达式理解为是一段可以传递的代码(将代码像数据一样进行传递); Lambda 表达式可以写出更简洁,更灵活的代码 ... 
- 【Java8新特性】Lambda表达式基础语法,都在这儿了!!
		写在前面 前面积极响应读者的需求,写了两篇Java新特性的文章.有小伙伴留言说:感觉Lambda表达式很强大啊!一行代码就能够搞定那么多功能!我想学习下Lambda表达式的语法,可以吗?我的回答是:没 ... 
- 【Java8新特性】- Lambda表达式
		Java8新特性 - Lambda表达式 生命不息,写作不止 继续踏上学习之路,学之分享笔记 总有一天我也能像各位大佬一样 一个有梦有戏的人 @怒放吧德德 分享学习心得,欢迎指正,大家一起学习成长! ... 
- 夯实Java基础(二十二)——Java8新特性之Lambda表达式
		1.前言 Java 8于14年发布到现在已经有5年时间了,经过时间的磨练,毫无疑问,Java 8是继Java 5(发布于2004年)之后的又一个非常最重要的版本.因为Java 8里面出现了非常多新的特 ... 
- java8新特性之——lambda表达式的使用
		lambda表达式简介 个人理解,lambda表达式就是一种新的语法,没有什么新奇的,简化了开发者的编码,其实底层还是一些常规的代码.Lambda 是一个匿名函数,我们可以把 Lambda 表达式理解 ... 
- 【Java8新特性】Lambda表达式
		一.Lambda 表达式 是什么? Lambda读音:拉姆达. Lambda是一个匿名函数,匿名函数就是一个没有名字的函数. Lambda 允许把函数作为一个方法的参数(函数作为参数传递进方法中). ... 
- Java8 新特性(一)- Lambda 表达式
		2014年3月18日发布了JavaSE 8 不追求技术的新,追求技术的稳定 本质:Lambda 表达式是一个匿名函数 作用:简化代码,增强代码的表达力 Lambda 语法格式 // 格式1:无参无返回 ... 
随机推荐
- 闭包引起的onclick不起作用
			问题描述:在html页面绑定onclick="cli()" 方法,定义在$(function( function cli(){} ))不起作用 $(function(){ func ... 
- topcoder srm 410 div1
			problem1 link 不包含$gridConnections$ 的联通块一定是连在所有包含$gridConnections$的联通块中最大的那一块上. import java.util.*; i ... 
- linux内核中的LPM是什么?
			答: 是usb的链接电源管理(Link Power Management),这是一个与usb硬件相关的能力,主机就能自动把设备设置成低功耗状态 
- 再谈fedora下的音乐和视频播放器的安装
			rpm包就相当于windows下的exe,已经是编译后的二进制代码,可以使用rpm命令或dnf install ???.rpm来安装 lnux下软件的安装跟windows不同, 后者要到处去找, 要做 ... 
- 关于 RabbitMQ 的 Dead-Letters-Queue “死信队列”
			来自一个队列的消息可以被当做‘死信’,即被重新发布到另外一个“exchange”去,这样的情况有: 消息被拒绝 (basic.reject or basic.nack) 且带 requeue=fa ... 
- js实现刷新iframe的方法汇总
			https://www.jb51.net/article/65013.htm javascript实现刷新iframe的方法的总结,现在假设存在下面这样一个iframe,则刷新该iframe的N种方法 ... 
- communication
			Always consider the challenge as a chance. Basic principles: Know your audience. Know your purpose. ... 
- Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.1:compile (default-compile) on project ppcloud-common: Compilation failure
			本文为博主原创,未经允许不得转载: [INFO] Finished at: 2018-09-19T20:26:05+08:00[INFO] ------------------------------ ... 
- Latex: "Missing $ inserted" 解决方法
			参考: Latex报"Missing $ inserted"的解决方法 Latex: "Missing $ inserted" 解决方法 原因一:在文中出现&q ... 
- 创建react项目
			npm搭建React项目 React官网提供最简便的方法是使用create-react-app npx create-react-app my-app cd my-app npm start 也可以自 ... 
