Java提升二:Lambda表达式与方法引用
1、Lambda表达式
1.1、定义
lambda表达式是对于函数式接口(只含有一个抽象方法的接口)的简洁实现方式。它与匿名内部类的作用相似,但是就使用范围而言,匿名内部类更为广泛,而lambda表达式则更为简洁。
1.2、使用
lambda表达式的写法:
(需要实现的方法的参数)->{对于方法的具体实现}
代码展示:
先定义一个函数式接口,并定义方法使用函数式接口。
//函数式接口
interface Cook{
//无参数无返回值的抽象方法
public void cooking(String person);
}
//函数式接口作为方法的参数使用
public static void invokeCook(String person,Cook cook){
cook.cooking(person);
}
若使用匿名内部类进行实现:
//使用匿名内部类实现Cook接口中的方法重写
invokeCook("小明", new Cook() {
@Override
public void cooking(String person) {
System.out.println(person+"快做饭");
}
});
改用lambda表达式优化:
//使用lambda表达式实现Cook接口中的方法重写
invokeCook("小明",(person)->{
System.out.println(person+"快做饭");
});
}
使用lambda表达式传参时,()中所传入的参数名可以不带类型标识符,但参数名必须于函数式接口中的方法的形参名保持一致。当lambda表达式要传递的参数为单参,且实现语句为单句时,可改写为如下形式:
//使用lambda表达式实现Cook接口中的方法重写
invokeCook("小明",person->System.out.println(person+"快做饭");
);
}
1.3、总结
(1) lambda表达式针对于函数式接口使用,使用形式简便,使用范围较小。
(2) lambda表达式是匿名内部类的进一步提炼优化,称为匿名内部类的语法糖。
(3) lambda表达式()中传入的参数是要实现的函数式接口中的抽象方法的形参。
2、方法引用
2.1、定义
方法引用是用来直接访问类或者实例已经存在的方法(注意:不是创建或实现方法)或者构造方法。方法引用提供了一种引用而不执行方法的方式,它需要由兼容的函数式接口构成的目标类型上下文。运行时,方法引用会创建函数式接口的一个实例。
2.2、使用
方法引用的写法:类名::已存在的方法
代码展示
先定义一个函数式接口,并定义方法使用函数式接口。
//函数式接口
@FunctionalInterface
interface Printable{
//打印字符串的抽象方法
void printMethod(String s);
}
//定义一个方法,参数传入函数式接口,对字符串进行打印
public static void printString(Printable p){
p.printMethod("hellowrold");
}
若使用匿名内部类进行实现:
//使用匿名内部类实现
printString(new Printable() {
@Override
public void printMethod(String s) {
System.out.println(s);
}
});
改用lambda表达式优化:
//调用printString方法,因为参数是函数式接口,可以使用Lambda表达式
printString((s)->{
System.out.println(s);
});
用方法引用优化:
//使用方法引用
//对象System.out已经存在,方法println也已经存在,
//可直接使用方法引用简化lambda表达式。
printString(System.out::println);
2.3、总结
(1)方法引用仅针对于函数式接口使用,调用函数式接口的抽象方法时,类名::方法表示的就是对于抽象方法的实现代码;调用其他方法时,都是只能调用类中已经存在的方法。
(2)方法引用与lambda表达式相比较,方法引用的使用范围更小,方式更简洁,便于在大量复用
(3)总体而言,方法引用是lambda表达式的语法糖。
Java提升二:Lambda表达式与方法引用的更多相关文章
- Java函数式编程:一、函数式接口,lambda表达式和方法引用
Java函数式编程 什么是函数式编程 通过整合现有代码来产生新的功能,而不是从零开始编写所有内容,由此我们会得到更加可靠的代码,并获得更高的效率 我们可以这样理解:面向对象编程抽象数据,函数式编程抽象 ...
- java8的新特性之lambda表达式和方法引用
1.1. Lambda表达式 通过具体的实例去体会lambda表达式对于我们代码的简化,其实我们不去深究他的底层原理和背景,仅仅从用法上去理解,关注两方面: lambda表达式是Java8的一个语法糖 ...
- JAVA8之Lambda表达式与方法引用表达式
一.Lambda表达式 基本语法: lambdaParameters->lambdaBody lambdaParameters传递参数,lambdaBody用于编写逻辑,lambda表达式会生成 ...
- java8 探讨与分析匿名内部类、lambda表达式、方法引用的底层实现
问题解决思路:查看编译生成的字节码文件 目录 测试匿名内部类的实现 小结 测试lambda表达式 小结 测试方法引用 小结 三种实现方式的总结 对于lambda表达式,为什么java8要这样做? 理论 ...
- Java 8中Lambda表达式默认方法的模板方法模式,你够了解么?
为了以更简单的术语描述模板方法,考虑这个场景:假设在一个工作流系统中,为了完成任务,有4个任务必须以给定的执行顺序执行.在这4个任务中,不同工作流系统的实现可以根据自身情况自定义任务的执行内容. 模板 ...
- Java 8 Lambda表达式之方法引用 ::双冒号操作符
双冒号运算符就是java中的方法引用,方法引用的格式是类名::方法名. 这里只是方法名,方法名的后面没有括号“()”.--------> 这样的式子并不代表一定会调用这个方法.这种式子一般是用作 ...
- Lambda表达式和方法引用
1 , 为什么用lambda表达式 将重复固定的代码写法简单化 2 ,lambda表达式的实质 对函数式接口的实现(一个接口中只有一个抽象方法的接口被称为函数式接口) package com.mo ...
- 一文带你深入了解 Lambda 表达式和方法引用
前言 尽管目前很多公司已经使用 Java8 作为项目开发语言,但是仍然有一部分开发者只是将其设置到 pom 文件中,并未真正开始使用.而项目中如果有8新特性的写法,例如λ表达式.也只是 Idea Al ...
- lambda表达式之方法引用
/** * 方法引用提供了非常有用的语法,可以直接引用已有Java类或对象(实例)的方法或构造器.<br> * 与lambda联合使用,方法引用可以使语言的构造更紧凑简洁,减少冗余代码. ...
随机推荐
- Redis常用命令操作
字符串类型: * 存储:set key value * 获取:get key * 无值返回nil * 删除:del key 哈希类型 hash: * 存储:hset key field value * ...
- scrapy 中 shell 出现 403 Forbiidden 解决方案
版权声明本文来自:https://blog.csdn.net/qq_37462361/article/details/87860025 进入正题: 出现 403,表示网站拒绝提供服务 (因为很多网站都 ...
- 「快学Docker」Docker简介、安装和Hello World实现
前言 Docker已经成为了一门炙手可热的技术,每个程序员(特别是后端程序员)都应该学习下Docker这门技术. Docker是什么 来自官网的定义:Docker是以Docker容器为资源分割和调度的 ...
- [转]:Ubuntu 下Apache安装和配置
[转]:Ubuntu 下Apache安装和配置_服务器应用_Linux公社-Linux系统门户网站 https://www.linuxidc.com/Linux/2013-06/85827.htm ...
- 吴裕雄--天生自然PythonDjangoWeb企业开发:Django文档阅读简介
Django是基于MVC模式的框架,虽然也被称为“MTV”的模式,但是大同小异.对我们来说,需要了解的是无论是MVC模式还是MTV模式,甚至是其他的什么模式,都是为了解耦.把一个软件系统划分为一层一层 ...
- Spark程序编译报错error: object apache is not a member of package org
Spark程序编译报错: [INFO] Compiling 2 source files to E:\Develop\IDEAWorkspace\spark\target\classes at 156 ...
- 小KING教你做android项目(二)---实现登陆页面并跳转和简单的注册页面
原文:http://blog.csdn.net/jkingcl/article/details/10989773 今天我们主要来介绍登陆页面的实现,主要讲解的就是涉及到的布局,以及简单的跳 ...
- Linux centosVMware Linux监控平台介绍、zabbix监控介绍、安装zabbix、忘记Admin密码如何做
一.Linux监控平台介绍 cacti.nagios.zabbix.smokeping.open-falcon等等 cacti.smokeping偏向于基础监控,成图非常漂亮 cacti.nagios ...
- Codeforces 1304B. Longest Palindrome
根据数据范围,暴力可以解决,对每一个串,找与其互为回文的串,或者判断自身是否为回文串,然后两两将互为回文的串排列在头尾,中间放且只能最多放一个自身为回文串的串,因为题目说每个串都是不同的 #inclu ...
- Codeforces1300D. Aerodynamic
本题题目有点绕,结合图例大概可知,P(x,y)是以点给出的一个凸包,T是一个点集合,也构成一个凸包,构成的方法就是将原点(0,0)在P(x,y)的边上跑,移动坐标轴,其构成的最远点是个凸包,我们可以画 ...