Lambda表达式

  Lambda 表达式是 JDK1.8 的一个新特性,又称特殊的匿名内部类,可以取代大部分的匿名内部类,语法更简洁,可以写出更优雅的 Java 代码,可以极大地优化代码结构。

  Lambda 表达式不会生成单独的内部类文件,但匿名内部类会。


Lambda表达式特性

  ★ Lambda 表达式没有显示的方法名。

  ★ Lambda 表达式很像一个函数,具有参数列表、函数体、返回类型、异常,但没有函数名。

  ★ Lambda 表达式可以作为方法的参数,也可以作为变量存储。

  ★ Lambda 表达式的代码更加简洁和精确。


Lambda表达式的定义

基本语法:

  <函数式接口>  <变量名> = (参数1, 参数2...) -> {

    //方法体

  };

  或

  <函数式接口>  <变量名> = (参数1, 参数2...) -> 表达式;

注意事项:

   Lambda 表达式由三部分构成:参数列表、箭头(->)、Lambda 体。

   Lambda 体,可以是一个表达式,也可以是一个语句块。

   Lambda 体,表达式中不能加入 return 语句,因为在表达式中已经隐含了 return 语句;但是,语句块中没有隐含,需要使用 return 语句。

   Lambda 表达式并不是对所有接口都可以实现,接口需要满足一个条件才能被Lambda 表达式实现:Lambda 规定接口中只能有一个需要被实现的方法。注意,并不是规定接口中只能有一个方法。

特别提醒:

    jdk1.8 中的另一个新特性:default,被 default 修饰的方法会有默认实现,不是必须被实现的方法。在实现Lambda 表达式的时候需注意。


Lambda 表达式的使用

1.无参,有返回值

@FunctionalInterface
public interface LambdaTest {
// 无参,有返回值
int method();
}
public class test {

    public static void main(String[] args) {

        LambdaTest test = ()-> 20;

        int result = test.method();

        System.out.println(result);
}
}

@FunctionalInterface注解:

  修饰函数式接口的,要求接口中的抽象方法只有一个。这个注解往往和 lambda 表达式一起出现。

2.无参,无返回值

@FunctionalInterface
public interface LambdaTest {
// 无参,无返回值
void method();
}
public class test {

    public static void main(String[] args) {

        LambdaTest test = () -> {};

        test.method();

    }
}

3.单参,有返回值

@FunctionalInterface
public interface LambdaTest {
// 单参,有返回值
int method(int a);
}
public class test {

    public static void main(String[] args) {

        // 表达式形式
LambdaTest test = a -> a+10; System.out.println(test.method(10)); // 代码块形式
LambdaTest test2 = a -> {
return a+10;
}; System.out.println(test2.method(10));
}
}

4.多参,有返回值

@FunctionalInterface
public interface LambdaTest {
// 多参,有返回值
int method(String a, String b);
}
public class test {

    public static void main(String[] args) {

        // 表达式形式
LambdaTest test = (a, b) -> a.length() - b.length(); System.out.println(test.method("abb", "bbccdd")); // 代码块形式
LambdaTest test2 = (a, b) -> {
return a.length() - b.length();
}; System.out.println(test2.method("abb", "bbccdd"));
}
}

表达式使用技巧总结

  ★ 形参列表的数据类型会自动判断。

  ★ 如果形参列表为空,只需保留()。

  ★ 如果形参只有一个,()可以省略,只需要参数的名称即可。

  ★ 如果执行语句只有一句,且无返回值,则{}可省略;如果有返回值,若想省略{},则必须同时省略return,且执行语句也必须保证只有一句。


Lambda 表达式应用

方法引用

  有时候我们不是必须要自己重写某个匿名内部类的方法,我们可以可以利用 lambda表达式的接口快速指向一个已经被实现的方法。

引用语法:

方法归属者::方法名

静态方法的归属者为类名,普通方法归属者为对象。

常见形式:

对象 :: 实例方法
  类 :: 静态方法
  类 :: 实例方法
  类 :: new

引用要求:

  ① 参数数量和类型要与接口中定义的一致。

  ② 返回值类型要与接口中定义的一致。

代码示例:

public class MethodReferences {
public static void main(String[] args) {
// 1.对象::实例方法
Consumer<String> consumer = s->System.out.println(s);
consumer.accept("hello"); Consumer<String> consumer2 = System.out::println;
consumer2.accept("world"); // 2.类::静态方法
Comparator<Integer> com = (o1, o2)->Integer.compare(o1, o2);
Comparator<Integer> com2 = Integer::compare; // 3.类::实例方法
Function<String, String> function = e->e.toUpperCase();
Function<String, String> function2 = String::toUpperCase;
System.out.println(function2.apply("hello")); // 4.类::new
Supplier<String> supplier = ()->new String();
Supplier<String> supplier2 = String::new;
System.out.println(supplier2.toString());
}
}

创建线程

public class TestLambda {
public static void main(String[] args) {
// 匿名内部类
Runnable runnable = new Runnable() { @Override
public void run() {
System.out.println("子程序执行。。。");
}
}; // Lambda表达式
Runnable runnable2 = ()->System.out.println("子程序执行2。。。");
new Thread(runnable2).start();

new Thread(()->System.out.println("子程序执行3。。。")).start();
}
}

集合操作

  可以调用集合的 public void forEach(Consumer<? super E> action) 方法,通过 Lambda 表达式的方式遍历集合中的元素。Consumer 接口是 jdk 为我们提供的一个函数式接口。

public class test {

    // 集合遍历
public static void main(String[] args) {
ArrayList<Integer> list = new ArrayList<>(); Collections.addAll(list, 4, 3, 9, 0, 5); // 方法引用
list.forEach(System.out::println); // Lambda表达式
list.forEach(element -> {
if (element % 2 == 0) {
System.out.println(element);
}
});
}
}
public class test {

    // 集合排序
public static void main(String[] args) {
ArrayList<Integer> list = new ArrayList<>(); Collections.addAll(list, 4, 3, 9, 0, 5); // 匿名内部类
list.sort(new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o1 - o2;
} }); // lambda表达式
list.sort((o1,o2)->o1-o2); list.forEach(System.out::println);
}
}

Java 中的 Lambda 表达式的更多相关文章

  1. Lambda 表达式,Java中应用Lambda 表达式

    一.Lambda 表达式 简单来说,编程中提到的 lambda 表达式,通常是在需要一个函数,但是又不想费神去命名一个函数的场合下使用,也就是指匿名函数. 链接:知乎 先举一个普通的 Python 例 ...

  2. Java中的Lambda表达式

    Lambda来源于希腊字母入,发音为  /'læmdə/对高数有所了解的人都知道λ用于声明一个数学逻辑系统,表示根据XX的输入参数,会返回某个Y结果.这正是编程语言中函数(方法)的意思.因此Lambd ...

  3. java中使用Lambda表达式的5种语法

    1,标准写法 思考下述情况: String[] arr = {"program", "creek", "is", "a" ...

  4. Java中的Lambda表达式简介及应用

    在接触Lambda表达式.了解其作用之前,首先来看一下,不用Lambda的时候我们是怎么来做事情的. 我们的需求是,创建一个动物(Animal)的列表,里面有动物的物种名,以及这种动物是否会跳,是否会 ...

  5. java中使用lambda表达式

    使用lambda表达式能够使复杂的编写方式变的简单 lambda表达式的语法 (parameters) -> expression 或 (parameters) ->{ statement ...

  6. 理解和运用Java中的Lambda

    前提 回想一下,JDK8是2014年发布正式版的,到现在为(2020-02-08)止已经过去了5年多.JDK8引入的两个比较强大的新特性是Lambda表达式(下文的Lambda特指JDK提供的Lamb ...

  7. Java中的lambda匿名函数使用

    Java中的lambda匿名函数使用 lambda匿名函数的使用是为了满足某些情况下需要临时定义函数,或者事先定义,需要时才使用.在python里面,lambda表达式的表达方式为:lambda 参数 ...

  8. 在Android中使用Java 8的lambda表达式

    作为一名Java开发者,或许你时常因为缺乏闭包而产生许多的困扰.幸运的是:Java's 8th version introduced lambda functions给我们带来了好消息;然而,这咩有什 ...

  9. C#中的Lambda表达式和表达式树

    在C# 2.0中,通过方法组转换和匿名方法,使委托的实现得到了极大的简化.但是,匿名方法仍然有些臃肿,而且当代码中充满了匿名方法的时候,可读性可能就会受到影响.C# 3.0中出现的Lambda表达式在 ...

随机推荐

  1. Flutter学习五之网络请求和轮播图的实现

    上期讲到了,怎样实现一个下拉刷新和加载更多的列表,数据更新,需要使用到网络请求,在flutter中,怎样实现一个网络请求呢?官方使用的是dart io中的HttpClient发起的请求,但HttpCl ...

  2. Spring系列之新注解配置+Spring集成junit+注解注入

    Spring系列之注解配置 Spring是轻代码而重配置的框架,配置比较繁重,影响开发效率,所以注解开发是一种趋势,注解代替xml配置文件可以简化配置,提高开发效率 你本来要写一段很长的代码来构造一个 ...

  3. Java环境变量配置 新手必备

    第一步:安装JDK,无脑下一步 建议修改安装路径 这里以jdk1.7为例子(之前帮机房安装软件,五六十台电脑都要用1.7); 2.安装完了之后右击此电脑,打开属性 打开系统高级设置 打开环境变量 这里 ...

  4. Java程序运行内存机制

    Java程序运行内存机制 栈内存包留调用方法.变量的区域,堆内存是new对象的区域,方法区为保存class文件的区域. 程序刚开始时,先加载类文件相应的数据到方法区,然后就从main()方法开始执行. ...

  5. webservice了解一下!!

    (1)什么是webservice? webservice是一种可以跨编程语言和跨平台进行远程调用的一种技术,是同步进行. webservice主要分为两种,一种是基于浏览器的瘦客户端应用程序,一种是基 ...

  6. Java知识系统回顾整理01基础04操作符02关系操作符

    一.关系操作符 关系操作符:比较两个变量之间的关系  > 大于 >= 大于或等于 < 小于 <= 小于或等于 == 是否相等 != 是否不等 public class Hell ...

  7. C++ 中explicit的作用

    转载:https://www.cnblogs.com/diligenceday/p/5781408.html C++ 中explicit的作用   explicit作用: 在C++中,explicit ...

  8. 编程体系结构(07):JavaEE之Web开发

    本文源码:GitHub·点这里 || GitEE·点这里 一.基础概念 1.CS与BS架构 CS架构模式 客户端/服务器(Client/Server)模式,既要编写服务器端程序,也要开发客户端程序,软 ...

  9. BUUCTF_web_三

    下面还是简单web的入门题 [GKCTF2020]cve版签到 这次的比赛最简单的题了吧,提示是CVE-2020-7066,但是网上没有几个关于这个漏洞的相关利用的文章,似乎是get_header() ...

  10. Linux Centos7 安装Docker-CE

    先确保yum 是最新版本 执行: sudo yum update 添加docker源地址 sudo yum-config-manager --add-repo https://download.doc ...