Lambda 表达式

​ ​ ​ ​ ​ ​ ​ ​ Lambda 表达式的实质属于函数式编程。

​ ​ ​ ​ ​ ​ ​ ​ 语法格式为:(parameters) -> expression(parameters) ->{statements; }

​ ​ ​ ​ ​ ​ ​ ​

Lambda 表达式的特点

  • Lambda 表达式只能引用标记了 final 的外层局部变量
  • 不能在lambda 内部修改定义在域外的局部变量
  • Lambda 表达式的局部变量可以不用声明为 final,但是必须不可被后面的代码修改(自带 final)
  • Lambda 表达式当中不允许声明一个与局部变量同名的参数或者局部变量

    ​ ​ ​ ​ ​ ​ ​ ​

Lambda 表达式的作用

  • 避免匿名内部类定义过多
  • 让代码更简洁,只留下核心逻辑

    ​ ​ ​

函数式接口

​ ​ ​ ​ ​ ​ ​ ​ 函数式接口 Functional Interface,是只包含唯一一个抽象方法的接口。对于函数式接口,可以通过 Lambda 表达式来直接创建该接口的对象。如 Runnable 接口:

public interface Runnable {
public abstract void run();
}

使用 Lambda 表达式实现 Runnable

//常规写法
new Thread(new Runnable(){
@Override
public void run(){
...
}
}).start(); //Lambda 表达式
new Thread( () -> {
...
}).start();

​ ​ ​ ​ ​ ​ ​ ​

JDK 1.8之前已有的函数式接口:

  • java.lang.Runnable
  • java.util.concurrent.Callable
  • java.security.PrivilegedAction
  • java.util.Comparator
  • java.io.FileFilter
  • java.nio.file.PathMatcher
  • java.lang.reflect.InvocationHandler
  • java.beans.PropertyChangeListener
  • java.awt.event.ActionListener
  • javax.swing.event.ChangeListener

JDK 1.8 新增加的函数接口:

  • java.util.function

​ ​ ​ ​ ​ ​ ​ ​

Lambda 表达式的简化过程

​ ​ ​ ​ ​ ​ ​ ​ 实现类-->静态内部类-->局部内部类-->匿名内部类-->Lambda 表达式

​ ​ ​ ​ ​ ​ ​ ​ 简化过程如下:

实现类

public class TestLamda01 {
public static void main(String[] args) {
DoSports jog = new Jog();
}
} interface DoSports{
void start();
} //实现类
class Jog1 implements DoSports{
@Override
public void start() {
System.out.println("I'm jogging");
}
}

静态内部类

public class TestLambda01 {
//静态内部类
static class Jog implements DoSports{
public void start(){
System.out.println("I'm jogging");
}
} public static void main(String[] args) {
DoSports jog = new Jog();
jog.start();
}
} interface DoSports{
void start();
}

局部内部类

public class TestLambda01 {

    public static void main(String[] args) {
//局部内部类
class Jog implements DoSports{
public void start(){
System.out.println("I'm jogging");
}
}
DoSports jog = new Jog();
jog.start();
}
} interface DoSports{
void start();
}

匿名内部类

public class TestLambda01 {

    public static void main(String[] args) {

        DoSports jog = new DoSports(){
public void start(){
System.out.println("I'm jogging");
}
};
jog.start();
}
} interface DoSports{
void start();
}

​ ​ ​ ​ ​ ​ ​ ​

Lambda 表达式

public class TestLambda01 {

    public static void main(String[] args) {

        DoSports jog = ()->{
System.out.println("I'm jogging"); //start() 方法执行主体
};
jog.start();
}
} interface DoSports{
void start();
}

含参数的 Lambda 表达式简化

​ ​ ​ ​ ​ ​ ​ ​ 当只有一个参数时,可简化参数类型和括号

public class TestLambda01 {

    public static void main(String[] args) {
/*可简化参数类型和括号
DoSports jog = (int a)->{
...
};*/
DoSports jog = a->{
//start() 方法执行主体
...
};
jog.start(参数1);
}
} interface DoSports{
void start(int a);
}

​ ​ ​ ​ ​ ​ ​ ​ 当有多个参数时,可简化参数类型,必须加括号

public class TestLambda01 {

    public static void main(String[] args) {
/*可简化参数类型和括号
DoSports jog = (int a,String b)->{
...
};*/
DoSports jog = (a,b)->{
//start() 方法执行主体
...
};
jog.start(参数1,参数2);
}
} interface DoSports{
void start(int a,String b);
}

Java8新特性——Lambda 表达式的更多相关文章

  1. Java8新特性-Lambda表达式是什么?

    目录 前言 匿名内部类 函数式接口 和 Lambda表达式语法 实现函数式接口并使用Lambda表达式: 所以Lambda表达式是什么? 实战应用 总结 前言 Java8新特性-Lambda表达式,好 ...

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

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

  3. java8新特性——Lambda表达式

    上文中简单介绍了一下java8得一些新特性,与优点,也是为本次学习java8新特性制定一个学习的方向,后面几篇会根据上文中得新特性一一展开学习.本文就从java8新特性中比较重要的Lambda表达式开 ...

  4. Java8新特性 - Lambda表达式 - 基本知识

    A lambda expression is an unnamed block of code (or an unnamed function) with a list of formal param ...

  5. java8新特性-lambda表达式和stream API的简单使用

    一.为什么使用lambda Lambda 是一个 匿名函数,我们可以把 Lambda表达式理解为是 一段可以传递的代码(将代码像数据一样进行传递).可以写出更简洁.更灵活的代码.作为一种更紧凑的代码风 ...

  6. Java8新特性: lambda 表达式介绍

    一.lambda 表达式介绍 lambda 表达式是 Java 8 的一个新特性,可以取代大部分的匿名内部类,简化了匿名委托的使用,让你让代码更加简洁,优雅. 比较官方的定义是这样的: lambda ...

  7. Java8 新特性lambda表达式(一)初始

    本篇参考Richard Warburton的 java8 Lambdas :Functional Programming for the Masses 学习lambda表达式之前,需要知道什么是函数式 ...

  8. Java8新特性-Lambda表达式

    1.  什么是Lambda表达式? Lambda表达式就是可以把函数作为参数传递,或者说把代码作为数据传递给函数. 2. Lambda表达式的语法格式 基本语法格式如下: 基本语法下多个变体的说明: ...

  9. Java8新特性——lambda表达式.(案例:词频统计)

    需求:读入一个文本文件,确定所有单词的使用频率并从高到低排序,打印出所有单词及其频率的排序列表 先用传统方法解: package cn._1.wordfrequency; import java.ut ...

随机推荐

  1. 闭包 panic recover

    闭包=函数+外层变量的引用 recover必须搭配defer使用 defer一定要在可能引发panic的语句之前定义

  2. 高德地图——公交路线规划(关键字&坐标)

    &plugin=AMap.Transfer 1.关键词方式---不支持途径(仅支持2个数据) <!DOCTYPE html> <html> <head> & ...

  3. opengl中标准矩形像素点手动网格化为三角形条带的实现

    这里以一张矩形图片为例进行说明: 一张图片的像素点是孤立的,导入opengl中进行绘制出来,看起来没问题,但是当我们放大图片时候,显示的就是一个个孤立的点,而没有像看图软件放大图片那样看起来还是连续的 ...

  4. Markdown Sublime flowchart.js 流程图

    先亮出来一个 flowchart.js 的 Sample 给 Sublime 安装 MarkdownPreview,这个不必多说了 Sublime Text -> Preferences -&g ...

  5. Linux学习笔记 - Linux快捷操作及常用命令

    一.快捷键 剪切光标前的内容 Ctrl + u 剪切光标至行末的内容 Ctrl + k 粘贴 Ctrl + u 或 Ctrl +k 的内容 Ctrl + y 移动光标到行末 Ctrl + e 移动光标 ...

  6. 羽夏笔记——PE结构(不包含.Net)

    写在前面   本笔记是由本人独自整理出来的,图片来源于网络.本人非计算机专业,可能对本教程涉及的事物没有了解的足够深入,如有错误,欢迎批评指正. 如有好的建议,欢迎反馈.码字不易,如果本篇文章有帮助你 ...

  7. HashMap 为什么线程不安全?

    作者:developer http://cnblogs.com/developer_chan/p/10450908.html 我们都知道HashMap是线程不安全的,在多线程环境中不建议使用,但是其线 ...

  8. 20200713晚 noip14

    考场 很紧张,上午考太烂了 开场看到"影魔",想起以前看过(但没做),心态爆炸,咆哮时被 hkh diss 了 T1 一开始想建边跑最长路,每个点在记录一下 \(\min\{a\} ...

  9. tomcat快速发布备份脚本

    一.说明 我们每次在tomcat中发布新war包,总是要经历[备份-停机-上传-启动]这几个部分,其中上传的环节和网速有极大相关性,要是网速很慢,那么整个发布的时间就会很长. 如果我们不借助于自动化发 ...

  10. Fastjson 1.2.22-24 反序列化漏洞分析(1)

    Fastjson 1.2.22-24 反序列化漏洞分析(1) 前言 FastJson是alibaba的一款开源JSON解析库,可用于将Java对象转换为其JSON表示形式,也可以用于将JSON字符串转 ...