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联合使用,方法引用可以使语言的构造更紧凑简洁,减少冗余代码. ...
随机推荐
- oracle 高级函数2
原 oracle 高级函数 2017年08月17日 16:44:19 阅读数:1731 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/u013278 ...
- python多线程下载ts文件
# -*- coding: utf-8 -*- """ Created on Wed Aug 22 15:56:19 2018 @author: Administrato ...
- async处理异步操作
async函数用async作为关键字,try和 catch来处理异常, await接受一个promise函数返回 async list () { try { await api.findjuBarDa ...
- 了解js闭包
定义:闭包是由函数以及创建该函数的环境组合而成.这个环境包含了这个闭包创建时所能访问的所有局部变量 理解:能够读取其他函数的内部变量的函数,并开辟新的作用域(环境) 例子1 function pare ...
- FormsAuthentication.HashPasswordForStoringInConfigFile方法再.net core中的替代代码
FormsAuthentication.HashPasswordForStoringInConfigFile()这个加密方法再.net core中不存在了,可以用下面的方式达到一样的加密效果 usin ...
- 最大流dinic板子
题目: https://www.luogu.com.cn/problem/P3376 #include <bits/stdc++.h> using namespace std; ; con ...
- 新增6 n个骰子的点数
/* * * 面试题43:n个骰子的点数 * 把n个骰子扔在地上,所有骰子朝上一面的点数之和为s. * 输入n,打印出s的所有可能的值出现的概率. * */ #include <iostream ...
- element ui表格表头顺序错乱的问题
因为在项目中两个表格共用了同一个组件, 但由于表头不完全相同, 就通过v-if来控制表头的显示隐藏,没想到造成了表头顺序的错乱, 经过多方查找资料,最后找到了解决方法: 即为每一列el-table-c ...
- ng -----监听变化($scope.$watch())
需求:项目组件中遇到改变日期触发方法. 困难:日期组件中不涉及释焦功能 解决:在angularjs中用$scope.$watch() 其中name是字符串,是指监听到的具体对象值.
- PHP实现微信网页登陆授权开发
这篇文章主要介绍了关于PHP实现微信网页登陆授权开发,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下 更多PHP相关知识请关注我的专栏PHPzhuanlan.zhihu.com 微信开 ...