Java8的两个重大改变,一个是Lambda表达式,另一个就是Stream API表达式。Stream 是Java8中处理集合的关键抽象概念,它可以对集合进行非常复杂的查找、过滤、筛选等操作,在新版的JPA【连接数据库】中,也已经加入了Stream
本次分享主要是Lambda表达式:

Lambda 表达式(lambda expression)是一个匿名函数,Lambda表达式基于数学中的λ演算得名,直接对应于其中的lambda抽象(lambda abstraction),是一个匿名函数,即没有函数名的函数。Lambda表达式可以表示闭包(注意和数学传统意义上的不同)。

1.C#的Lambda 表达式都使用 Lambda 运算符 =>,该运算符读为“goes to”。语法如下:

(object argOne, object argTwo) => {; /*Your statement goes here*/}

函数体多于一条语句的可用大括号括起
类型
可以将此表达式分配给委托类型,如下所示:

delegate int del(int i);
del myDelegate=x=>{return x*x;};
int j = myDelegate(5); //j=25

创建表达式目录树类型:

using System.Linq.Expressions;
//...
Expression <del>=x=>x*x;

=> 运算符具有与赋值运算符 (=) 相同的优先级,并且是右结合运算符。
Lambda 用在基于方法的 LINQ 查询中,作为诸如 Where 和 Where 等标准查询运算符方法的参数
!!!!在 is 或 as 运算符的左侧不允许使用 Lambda。

下列规则适用于 Lambda 表达式中的变量范围:
1.捕获的变量将不会被作为垃圾回收,直至引用变量的委托超出范围为止。
2.在外部方法中看不到 Lambda 表达式内引入的变量。
3.Lambda 表达式无法从封闭方法中直接捕获 ref 或 out 参数。
4.Lambda 表达式中的返回语句不会导致封闭方法返回。
5.Lambda 表达式不能包含其目标位于所包含匿名函数主体外部或内部的 goto 语句、break 语句或 continue 语句。
6.Lambda表达式的本质是“匿名方法”,即当编译我们的程序代码时,“编译器”会自动将“Lambda表达式”转换为“匿名方法”,如下例:

string[] names={"agen","balen","coure","apple"};
string[] findNameA=Array.FindAll<string>(names,delegate(string v){return v.StartsWith("a");});
string[] findNameB=Array.FindAll<string>(names,v=>v.StartsWith("a"));

上面中两个FindAll方法的反编译代码如下:

string[] findNameA=Array.FindAll<string>(names,delegate(string v){return v.StartsWith("a");});
string[] findNameB=Array.FindAll<string>(names,delegate(string v){return v.StartsWith("a");});

从而可以知道“Lambda表达式”与“匿名方法”是可以划上等号的,只不过使用“Lambda表达式”输写代码看上去更直观漂亮
C#的Lambda表达式的语法格式:
参数列表 => 语句或语句块 [1]

2.Java的Lambda表达式

Java 8的一个大亮点是引入Lambda表达式,使用它设计的代码会更加简洁。当开发者在编写Lambda表达式时,也会随之被编译成一个函数式接口。下面这个例子就是使用Lambda语法来代替匿名的内部类,代码不仅简洁,而且还可读。
java中的Lambda表达式中引入的操作符及注意事项:

java中的Lambda表达式中 函数式接口
(1)什么是函数式接口?
函数接口:如果一个接口只有一个抽象方法,则该接口称之为函数式接口,函数式接口可以使用Lambad表达式,Lambda表达式会倍匹配到这个抽象方法上。

(2)如果我自己不知道该接口是否符合函数式接口怎么办?
如果分不清是否符合的话可以采用注解的方式来检测,@Functionallnterface 注解可以检测接口是否符合函数式接口

@Functionallnterface使用:


// 正确的函数式接口
@FunctionalInterface
public interface TestInterface {  // 抽象方法  public void sub();  // java.lang.Object中的方法不是抽象方法  public boolean equals(Object var1);  // default不是抽象方法  public default void defaultMethod(){  }  // static不是抽象方法  public static void staticMethod(){  }
}

常见的函数式接口:

使用lambda表达式和没有使用的区别

没有使用Lambda的老方法:

button.addActionListener(new ActionListener(){public void actionPerformed(ActionEvent actionEvent){System.out.println("Action detected");}
});

使用Lambda:

button.addActionListener( actionEvent -> { System.out.println("Action detected");
});

让我们来看一个更明显的例子。
不采用Lambda的老方法:

Runnable runnable1=new Runnable(){@Override
public void run(){System.out.println("Running without Lambda");
}
};

使用Lambda:

Runnable runnable2=()->System.out.println("Running from Lambda");

正如你所看到的,使用Lambda表达式不仅让代码变的简单、而且可读、最重要的是代码量也随之减少很多。然而,在某种程度上,这些功能在Scala等这些JVM语言里已经被广泛使用。
一方面,如果Java继续围绕Lambda来发展和实现Scala都已经实现的功能,那么可能就不需要Scala了。另一方面,如果它只提供一些核心的功能,例如帮助匿名内部类,那么Scala和其他语言将会继续茁壮成长,并且有可能会凌驾于Java之上。其实这才是最好的结果,有竞争才有进步,其它语言继续发展和成长,并且无需担心是否会过时。

关于Stream API表达式我会在下篇文章进行详细分享,有兴趣的小伙伴可以关注一下

jdk1.8新特性之Lambda表达式相关推荐

  1. Jdk1.8新特性(二)——lambda表达式(参数列表)-{}和函数式接口@FunctionalInterface

    Jdk1.8新增lambda表达式是为了简化代码,主要用于简化匿名实现类,为其提供一种更加简洁的写法.Lambda表达式在swift语言中被称为代码块,lambda表达式可以认为是一种特殊的接口,是匿 ...

  2. jdk1.8新特性之lambda表达式及在Android Studio中的使用举例

    Jdk1.8已经出很久了但是很多同学对它的特性在android studio 中的应用可能还不是很熟悉,今天我们就来对这个新特性在AS中做它的应用实践. 一.首先在有JDK1.8的情况下我们要在AS的 ...

  3. JDK1.8新特性之Lambda表达式+Stream流+函数式接口

    一.Lambda表达式 Lambda表达式,是JDK1.8引入的一种语法,这种语法可以对匿名内部类的写法,进行简写. 1.快速入门 package org.westos.demo2;import ja ...

  4. JDK1.8新特性:lambda表达式

    一.类定义 package com.xxx;import java.math.BigDecimal;public class Student {private String name;private ...

  5. 【java8新特性】——lambda表达式与函数式接口详解(一)

    一.简介 java8于2014年发布,相比于java7,java8新增了非常多的特性,如lambda表达式.函数式接口.方法引用.默认方法.新工具(编译工具).Stream API.Date Time ...

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

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

  7. JDK8新特性之Lambda表达式

    转载自 JDK8新特性之Lambda表达式 什么是Lambda表达式 Java 8的一个大亮点是引入Lambda表达式,使用它设计的代码会更加简洁.当开发者在编写Lambda表达式时,也会随之被编译成 ...

  8. java8新特性之lambda表达式--超级详细版本

    java8新特性之lambda表达式 1.什么是lambda表达式?为什么用它? 2. 为什么Java需要lambda表达式? 3. lambda表达式的语法 4.函数式接口 4.1 什么是函数式接口 ...

  9. 深圳Java培训学习:Java8.0新特性之Lambda表达式--【千锋】

    深圳Java培训学习:Java8.0新特性之Lambda表达式–[千锋] 前言 Java 8 已经发布很久了,很多报道表明Java 8 是一次重大的版本升级.本篇文章,主要给大家介绍的是lambda表 ...

最新文章

  1. vim编辑器----常用命令
  2. POJ-2635 The Embarrassed Cryptographer 大数取模
  3. centos7不能安装mysql数据库_Centos7 上安装mysql遇上的问题:mysql无法正常启动-Go语言中文社区...
  4. 将0移到最后,在原数组操作,并且不能改变源数据顺序(JS编程)
  5. 一个容易忽略的问题—Javascript文件加载的顺序
  6. MySQL使用裸设备
  7. oracle dblink 验证,Oracle DBLINK 简单使用
  8. 三星note9刷Android9,三星Note9官方韩版安卓9固件rom线刷刷机包:N960NKSU2CSE3
  9. 系统辨识与自适应控制matlab仿真下载,系统辨识与自适应控制MATLAB仿真 全部程序...
  10. 阿里矢量图标(字体图标) 、 阴影
  11. 索尼微单连android手机软件,(收藏)如何将手机连接上SONY微单的WIFI进行遥控拍摄...
  12. SQL 触发器 简记
  13. 怎样用photoshop放大图片可以不失真的方法
  14. 解决一例Fedora 31安装NVIDIA官方驱动程序无法使用DKMS注册的问题
  15. 易康EPS2的使用(一)
  16. Pytorch安装教程
  17. 在线机械键盘测试软件,键盘检测软件(DAS G2 104/105 Keyboard Test Tool)
  18. SAR成像处理算法_CS算法_原理
  19. [源码和文档分享]基于8253、8255芯片汇编实现简易电子琴
  20. 电脑桌面下方的任务栏卡死解决方案:

热门文章

  1. 利用JavaScript计算圆的面积
  2. 递推算法之斐波那契数列——昆虫繁殖
  3. 互联网黑话最全收录|还在说大白话?看完这篇包你成为职场“社牛”
  4. PowerDesigner12版本过期解决办法
  5. ConvLSTM:一种用于降水预报的机器学习方法
  6. Winform 自动升级程序
  7. 2007年下半年全国计算机技术与软件专业技术资格(水平)考试湖南省报考工作实施细则...
  8. 服务器i620-g15用什么型号内存,定位不同领域 曙光I620-G15服务器评测
  9. c语言实现在数组中找一个数字显示,C语言找出数组中的特定元素的算法解析
  10. 【C++入门】函数重载,引用,内联函数......