在说一下Lambda表达式之前,我们先了解下为什么java要引入Lambda表达式
在java8 之前要将行为参数化我们有两种选择:
1.策略模式,根据参数传入的具体实现决定方法的实现
2.匿名内部类。
1的缺点是要新增新的行为必须创建新的行为并实现接口;2的缺点是不得不写很多模板代码,可读性差。
引入Lambda 前提条件
在很多函数式编程语言中允许将函数作为值,Java8也新增了这一特性,即允许方法作为值来传递,实现行为参数化。
在Java8之前筛选出隐藏文件可能需要这么做:
File[] hiddenFiles = new File(".").listFiles(new FileFilter() {
public boolean accept(File file) {
return file.isHidden();
}
Java8之后只需要这么做:
File[] hiddenFiles = new File(".").listFiles(File::isHidden);
其中File::isHidden被称为方法应用,只要在方法体中存在执行体,方法应用就可以传递代码。
Lambda——匿名函数
函数式编程的概念:编写把函数作为值来传递的程序。
add方法对两个int值进行求和写作: (int x,int y) -> x+y,这部分可替代写个工具类然后调用如: Math::add,这样写更为简介,也不需要编辑新的类。
Lambda特性:
1.匿名:lambda表达式是没有名字的
2.函数:为什么叫函数而不是方法呢,因为Lambda函数不像方法那样属于某个类。但和方法一样Lambda有参数列表、函数主体返回类型、抛出异常。
3.传递:可作为值在方法参数中传递】
4.简洁
Lambda语法:
(parameters) -> expression或 (parameters) -> { statements; }
从左往右 lambda表达式有 参数列表、箭头、和函数主体构成。
函数体中使用了花括号需要显式使用return 返回,不使用花括号则不需要return关键字
函数式接口:
既然函数可作为值来传递那么肯定需要相应的规则,类似与我们把方法参数限定为指定接口类型一样,需要传递实现接口的类或者匿名内部类作为值,同样这里也按照规范定义了函数式接口,用来限定传递代码的参数和返回值(注意:Java8并没有引入函数这一类型)。
函数式接口与之前的接口区别就是只允许定义一个抽象方法(见下面),原因就不用多说了,都可以理解,函数式接口中方法的签名被叫做Lambda表达式的签名,编译器会根据函数式接口的签名和上下文进行类型推断保证不会出现编译错误,下面的是有效的。
Runnable a = () -> System.out.println(111);
a.run();
在Java8中类似Runnable、Comparable都是函数式接口。
@FunctionalInterface 注解
1、该注解只能标记在"有且仅有一个抽象方法"的接口上。
2、JDK8接口中的静态方法和默认方法,都不算是抽象方法。
3、接口默认继承java.lang.Object,所以如果接口显示声明覆盖了Object中方法,那么也不算抽象方法。
4、该注解不是必须的,如果一个接口符合"函数式接口"定义,那么加不加该注解都没有影响,类似@override。加上该注解能够更好地让编译器进行检查。如果编写的不是函数式接口,但是加上了@FunctionInterface,那么编译器会报错。
使用函数式接口,java.util.function包
为了简化Java内置了常见的几种函数式接口Predicate<T>、Consumer<T>和Function<T,R>
Predicate有一个抽象方法test,输入为人意类型返回 boolean类型
Consumer有一个抽象方法accept,返回为空,输入为任意类型。
Function 有一个抽象方法返回为R类型输入为T类型。
方法引用
在大多数情况下我们应该考虑复用已有的东西而不是重新造轮子,方法引用就是Lambda表达式的一个
快捷方式,即方法应用会根据已有的方法实现来创建一个Lambda表达式。当你需要使用方法引用时,目标引用放在分隔符::前,方法的名称放在后面。例如, Apple::getWeight就是引用了Apple类中定义的方法getWeight。
方法引用主要有三类。
(1) 指向静态方法的方法引用(例如Integer的parseInt方法,写作Integer::parseInt)。
(2) 指向任意类型实例方法的方法引用(例如String的length方法,写作 String::length)。
(3) 指向现有对象的实例方法的方法引用(假设你有一个局部变量expensiveTransaction 用于存放Transaction类型的对象,它支持实例方法getValue,那么你就可以写expensive- Transaction::getValue)。
例如:
List<String> str = Arrays.asList("a","b","A","B");
str.sort((s1, s2) -> s1.compareToIgnoreCase(s2));
List<String> str = Arrays.asList("a","b","A","B");
str.sort(String::compareToIgnoreCase);
下面的写法是等效的:
Function<String, Integer> stringToInteger = (String s) -> Integer.parseInt(s);
Function<String, Integer> stringToInteger = Integer::parseInt;
还有一种特殊的函数应用:构造函数应用
分享到:
相关推荐
Python 079.lambda表达式和匿名函数.mp4
Lambda表达式是C#编程语言中的一个重要特性,它在处理函数式编程和LINQ查询时尤其有用。Lambda表达式提供了一种简洁的方式来定义匿名函数,使得代码更加紧凑和易读。下面我们将深入探讨C# Lambda表达式的概念、语法...
2. Lambda表达式:Java 8中引入的一种新的函数式编程方式,可以将函数作为参数传递给其他函数。 3. filter方法:Stream API中的一个方法,用于对集合进行过滤。 4. limit方法:Stream API中的一个方法,用于将结果...
2. Lambda 表达式可以在使用的地方声明,并且可以在 lambda 函数中使用 lambda 函数之外的数据。 Lambda 表达式与匿名方法的对比: 1. Lambda 表达式和匿名方法都可以用来创建委托或表达式树类型。 2. 但是,...
- `[=]`:按值捕获所有变量,意味着在lambda表达式内部创建这些变量的副本,但不能修改它们。 - `[&]`:按引用捕获所有变量,允许在lambda表达式内部读写这些变量。 - `[var]`或`[&var]`:按需捕获单个变量,可以...
在这个主题中,我们将深入探讨"进度条"、"Lambda表达式"、"匿名方法"、"委托"、"类"、"集合"以及"初始化"这些核心概念,它们都是.NET框架中的重要组成部分。 首先,让我们来看一下"进度条"。在开发用户界面时,...
在本资料"2_Lambda表达式.zip"中,我们可能将深入学习Lambda表达式的概念、语法以及在实际开发中的应用。 Lambda表达式的语法结构简洁明了,通常由三部分组成:参数列表、箭头符号(->)和函数体。例如,一个简单的...
### 深入理解Kotlin中的Lambda表达式 Kotlin作为一种现代、静态类型的编程语言,在Java虚拟机(JVM)上运行,同时也支持编译成JavaScript或原生代码。Kotlin的一大亮点在于它对函数式编程的支持,尤其是通过lambda...
2. Lambda表达式简介:Lambda表达式提供了一种定义匿名方法的简洁方式。它们通常用于编写那些仅需要一次使用的小型方法。在LINQ中,Lambda表达式常用于编写查询表达式中的条件部分,以筛选、排序等。 3. LINQ操作...
通过多个示例详细演示了.Net中C#语言lambda表达式的基本用法,主要包括三个方面内容: 1.什么是lambda表达式 2.理解lambda表达式 3.使用lambda表达式
2. Lambda表达式可访问作用域内的任何变量,代码简洁。 使用Lambda表达式可以使代码更加简洁、清晰、可读性更强。如果需要修改代码,涉及的内容就在附近。Lambda表达式可以与STL的一些算法结合使用,例如std::...
在.NET框架中,C#是一种强大的编程语言,它支持Lambda表达式,这使得代码更加简洁、易读。Lambda表达式通常用于LINQ(Language Integrated Query)查询,它允许程序员使用类似SQL的语法在内存中的数据集上进行操作。...
**Lambda表达式详解** 在Java编程语言中,Lambda表达式是一种简洁、强大的功能,自Java 8开始引入,它使得函数式编程的概念得以实现。Lambda表达式的主要目标是简化处理匿名函数,即没有名字的函数,尤其在处理集合...
2. **Lambda表达式的语法** Lambda表达式的语法形式为:`参数列表 -> 表达式或代码块`。例如,一个接受两个整数并返回它们之和的Lambda表达式可以写作`(int a, int b) -> a + b`。 3. **函数式接口** Lambda...
根据给定文件信息,内容主要围绕Java中Lambda表达式对集合进行操作,以下是详细的知识点: 1. Lambda表达式基础: Lambda表达式是Java 8引入的一种简洁的表示可传递的匿名函数的方式。它允许我们将函数作为参数传递...
2. Lambda表达式的语法:Lambda表达式由三部分组成:参数列表、箭头符号和函数体。例如,`Test4`是一个函数式接口,含有一个抽象方法`call(int c, int b)`,我们可以这样创建Lambda实例: ```java Test4 a1=(c,b) ->...
Java 8 的引入,尤其是Lambda表达式,对Java语言产生了深远的影响,它为Java开发者带来了更简洁、更灵活的编程方式。Lambda表达式是函数式编程的核心元素,它允许我们将函数作为方法参数传递,或者将代码块当作数据...
"C# Lambda 表达式的使用" Lambda 表达式是 C# 编程语言中的一个重要概念,也是函数式编程的基础。Lambda 表达式可以被用作创建委托对象或表达式树类型。所有的 Lambda 表达式都使用操作符“=>“,表示“goes to ...
Java 8 的 Lambda 表达式是 Java 编程语言的重大革新,它引入了一种新的函数式编程概念,使得代码更加简洁、可读性更强。Lambda 表达式允许我们将函数作为一个方法参数,或者把函数作为方法返回值,极大地简化了处理...
Java 8 是一个重要的Java平台版本,因为它引入了许多新特性,其中最显著的就是Lambda表达式。Lambda表达式是函数式编程的关键元素,它允许我们以更简洁、更易读的方式编写代码,特别是在处理集合和并发任务时。在这...