【Java8新特性】Lambda表达式
一、Lambda 表达式 是什么?
Lambda读音:拉姆达。
- Lambda是一个匿名函数,匿名函数就是一个没有名字的函数。
- Lambda 允许把函数作为一个方法的参数(函数作为参数传递进方法中)。
- Lambda 表达式可以使代码变的更加简洁紧凑。
语法
lambda 表达式的语法格式如下:
(parameters) -> expression
或
(parameters) ->{ statements; }
Java8 中引入了一个新的操作符 "->", 该操作符称为箭头操作符或 Lambda 操作符。
箭头操作符将 Lambda 表达式拆分成两部分:
左侧 : Lambda 表达式的参数。
右侧 : Lambda 表达式中所需执行的操作, 即 Lambda 体。
lambda表达式的重要特征:
- 可选类型声明:不需要声明参数类型,编译器可以统一识别参数值。
- 可选的参数圆括号:一个参数无需定义圆括号,但多个参数需要定义圆括号。
- 可选的大括号:如果主体只有一个语句,可以不需要使用大括号。
- 可选的返回关键字:如果主体只有一个表达式返回值则编译器会自动返回值,大括号需要指定表达式返回了一个数值。
二、Lambda 表达式实例
Lambda 表达式的简单例子:
// 1. 无参数,无返回值
() -> System.out.print("Hello Lambda");
// 2. 无参数,有返回值,返回值 5
() -> 5;
// 3. 一个参数(箭头左侧括号可以省略),返回“参数+1”后的值
x -> x + 1
// 4. 两个参数(多个参数时,箭头左侧括号不可以省略),返回它们的差值
(x, y) -> x - y
// 5. 三个int型整数(支持多个参数),返回它们的和
(int x, int y, int z) -> x + y + z
// 6. 接收一个 string 对象,并在控制台打印,不返回任何值(大括号可以省略)
(String s) -> System.out.print(s)
或
(String s) -> { System.out.print(s); }
注 : Lambda 表达式中的参数类型都是由编译器推断得出的。 Lambda 表达式中无需指定类型,程序依然可以编译,这是因为 javac 根据程序的上下文,在后台推断出了参数的类型。 Lambda 表达式的类型依赖于上下文环境,是由编译器推断出来的,这就是所谓的 “类型推断”。
三、函数式接口(function interface)
Lambda 表达式需要 “函数式接口” 的支持。
函数式接口 : 接口中只有一个抽象方法的接口,称为函数式接口,可以通过 Lambda 表达式来创建该接口的对象。
可以使用 @FunctionalInterface 注解来检查该接口是否为函数式接口,同时 javadoc 也会包含一条声明,说明这个接口是一个函数式接口,可以有效避免其它开发人员在该接口中新增额外的方法。
简单示例
接口:
//自定义函数式接口
@FunctionalInterface
public interface MyFun {
void run();
}
应用:
public static void main(String[] args) {
//jdk8之前
testMyFun(new MyFun() {
@Override
public void run() {
System.out.println("这是自定义函数接口");
}
});
//java8使用lambada表达式,代码更简洁
testMyFun(() -> System.out.println("这是自定义函数接口"));
}
private void testMyFun(MyFun myFun) {
myFun.run();
}
四、java8四大内置核心函数式接口
java8为我们定义好了4类内置函数式接口,这4类接口基本能够满足平时的开发需要,如果有比较特殊的情况我们可以自己去定义函数式接口。
1、consumer 消费型接口,有入参,没有返回值
@FunctionalInterface
public interface Consumer<T> {
/**
* Performs this operation on the given argument.
*
* @param t the input argument
*/
void accept(T t);
}
应用示例:
public static void main(String[] args) {
consumTest(1000,x-> System.out.println("消费了:"+x+"元"));
}
public void consumTest(int money, Consumer consumer){
consumer.accept(money);
}
2、Supplier 提供型接口,空参,有返回值
@FunctionalInterface
public interface Supplier<T> {
/**
* Gets a result.
*
* @return a result
*/
T get();
}
应用示例:
public static void main(String[] args) {
int i = supplyTest(() -> (int) (Math.random() * 10););
System.out.println("获得的随机数是:"+i);
}
public int supplyTest(Supplier<Integer> supplier){
return supplier.get();
}
3、Function<T, R> 函数型接口,有入参,有返回值
@FunctionalInterface
public interface Function<T, R> {
/**
* Applies this function to the given argument.
*
* @param t the function argument
* @return the function result
*/
R apply(T t);
}
应用示例:计算一个数的2倍,并输出结果
public static void main(String[] args) {
int num = functionTest(5, x -> x * 2);
System.out.println("计算后的结果值是:"+num);
}
public int functionTest(int a,Function<Integer,Integer> function){
return function.apply(a);
}
4、Predicate 断言型接口,返回真假
@FunctionalInterface
public interface Predicate<T> {
/**
* Evaluates this predicate on the given argument.
*
* @param t the input argument
* @return {@code true} if the input argument matches the predicate,
* otherwise {@code false}
*/
boolean test(T t);
}
应用示例:判断一个数是否大于10,并输出真假
public static void main(String[] args) {
boolean flag = predicateTest(20, x -> x > 10);
System.out.println("20比10大吗:"+ flag);
}
public boolean predicateTest(int x,Predicate<Integer> predicate){
return predicate.filter(x);
}
【Java8新特性】Lambda表达式的更多相关文章
- Java8新特性-Lambda表达式是什么?
目录 前言 匿名内部类 函数式接口 和 Lambda表达式语法 实现函数式接口并使用Lambda表达式: 所以Lambda表达式是什么? 实战应用 总结 前言 Java8新特性-Lambda表达式,好 ...
- 乐字节-Java8新特性-Lambda表达式
上一篇文章我们了解了Java8新特性-接口默认方法,接下来我们聊一聊Java8新特性之Lambda表达式. Lambda表达式(也称为闭包),它允许我们将函数当成参数传递给某个方法,或者把代码本身当作 ...
- java8新特性——Lambda表达式
上文中简单介绍了一下java8得一些新特性,与优点,也是为本次学习java8新特性制定一个学习的方向,后面几篇会根据上文中得新特性一一展开学习.本文就从java8新特性中比较重要的Lambda表达式开 ...
- Java8新特性 - Lambda表达式 - 基本知识
A lambda expression is an unnamed block of code (or an unnamed function) with a list of formal param ...
- java8新特性-lambda表达式和stream API的简单使用
一.为什么使用lambda Lambda 是一个 匿名函数,我们可以把 Lambda表达式理解为是 一段可以传递的代码(将代码像数据一样进行传递).可以写出更简洁.更灵活的代码.作为一种更紧凑的代码风 ...
- Java8新特性: lambda 表达式介绍
一.lambda 表达式介绍 lambda 表达式是 Java 8 的一个新特性,可以取代大部分的匿名内部类,简化了匿名委托的使用,让你让代码更加简洁,优雅. 比较官方的定义是这样的: lambda ...
- Java8 新特性lambda表达式(一)初始
本篇参考Richard Warburton的 java8 Lambdas :Functional Programming for the Masses 学习lambda表达式之前,需要知道什么是函数式 ...
- Java8新特性——Lambda 表达式
Lambda 表达式 Lambda 表达式的实质属于函数式编程. 语法格式为:(parameters) -> expression ...
- Java8新特性-Lambda表达式
1. 什么是Lambda表达式? Lambda表达式就是可以把函数作为参数传递,或者说把代码作为数据传递给函数. 2. Lambda表达式的语法格式 基本语法格式如下: 基本语法下多个变体的说明: ...
- Java8新特性——lambda表达式.(案例:词频统计)
需求:读入一个文本文件,确定所有单词的使用频率并从高到低排序,打印出所有单词及其频率的排序列表 先用传统方法解: package cn._1.wordfrequency; import java.ut ...
随机推荐
- 遇到的问题之“Dubbo 直连 Invoke remote method timeout 问题!”
Dubbo 直连 Invoke remote method timeout 问题! 在测试环境消费者直连服务端进行测试时, 其中一个RPC接口抛出一个错误, 如下: Caused by: com. ...
- SpringAop实现原理及代理模式
Spring Aop的原理 Spring的AOP就是通过动态代理实现的.当为某个Bean或者某些Bean配置切面时,Spring会为其创建代理对象,当调用该对象的某个方法时,实际是调用生成的代理类的对 ...
- Altium design使用日常故障总结
1.altiumdesigner09如何将不同的板子拼在一起发给工厂?打开这两个图,其中一个图ctrl+a,ctrl+c,打开另一个图pastespecial.放置时选取一边对齐.制版时告诉厂家做个V ...
- 块级格式化上下文(BFC)
一.什么是BFC 具有BFC属性的元素也属于普通流定位方式,与普通容器没有什么区别,但是在功能上,具有BFC的元素可以看做是隔离了的独立容器,容器里面的元素不会在布局上影响到外面的元素,并且具有普通容 ...
- Hadoop本地编写的jar包放到集群执行时报错处理
错误描述: 020-03-24 22:45:23,204 WARN org.apache.hadoop.yarn.server.nodemanager.DefaultContainerExecutor ...
- java基础-多线程互斥锁
多线程(JDK1.5的新特性互斥锁)* 1.同步 * 使用ReentrantLock类的lock()和unlock()方法进行同步* 2.通信 * 使用ReentrantLock类的newCondit ...
- DOS控制台
:win+r--cmd--回车* A:d: 回车 盘符切换* B:dir(directory):列出当前目录下的文件以及文件夹* C:cd (change directory)改变指定目录(进入指定目 ...
- Java对象和多态
Java对象和多态 (面向对象) 面向对象基础 面向对象程序设计(Object Oriented Programming) 对象基于类创建,类相当于一个模板,对象就是根据模板创建出来的实体(就像做月饼 ...
- 搭建MySQL集群-注意版本
系统环境采样(来自其他机器,直接copy过来的,在安装的机器上,按照步骤查看即可,当然这些还不够实际,后续补充) 检查系统内是否有其他mysql rpm -qa | grep mysql 是否存在my ...
- rancher 添加集群
用rancher的管理账户登录rancher控制台首先创建用户 jinzs,后面用户绑定到要添加的集群上的 其次点全局,出现集群列表 >点添加集群 这里集群名称任意,只要你知道,该名称要对应实际 ...