廖雪峰Java16函数式编程-1Lambda表达式-1Lambda基础
1. 函数式编程
Java有2类方法:
- 实例方法:通过实例调用
- 静态方法:通过类名调用
- Java的方法相当于过程式语言的函数
函数式编程(Functional Programing):
- 把函数作为基本运算单元
- 函数可以作为变量,传递给另一个函数
- 函数可以接收函数
- 函数可以返回函数
历史研究函数式编程的理论是Lambda演算,所以把支持函数式编程的风格成为Lambda表达式
2. Java的单方法接口
在Java中,有许多接口只定义了1个方法:
- Comparator
- Runnable
- Callable
- 只定义了单个抽象方法的接口,可以被标注为@FunctionalInterface

3. Java的Lambda表达式:
- JDK >= 1.8
- 简化语法 不再需要匿名类的定义
- 类型自动推断(编译器自动完成) 不需要在方法中声明参数类型
* 如Comparator接口传入的参数是2个String类型,可以省略;返回1个int类型,也可以省略。
使用匿名类方式实现一个单方法接口的时候,代码比较繁琐,需要覆写这个方法,而使用Lambda表达式的时候,我们可以大大的简化语法。()表示参数,->{}表示方法过程
以Comparator为例:

4. 代码示例
package csj2019;
import java.util.Arrays;
import java.util.Comparator;
public class LambdaSimple {
public static void main(String[] args) throws Exception{
String[] words = "Improving code with Lambda expression In Java".split(" ");
/** Arrays.sort(words, new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
return o1.toLowerCase().compareTo(o2.toLowerCase());
}
});
System.out.println(Arrays.toString(words)); */
Arrays.sort(words,(s1,s2)->{
return s1.toLowerCase().compareTo(s2.toLowerCase());
});
System.out.println(Arrays.toString(words));
}
}

5. 总结:
- Java8引入了Lambda语法,用以简化单抽象方法接口的实现
- Lambda语法实现了类型自动推断
- 单抽象方法接口被成为函数式接口
廖雪峰Java16函数式编程-1Lambda表达式-1Lambda基础的更多相关文章
- 廖雪峰Java16函数式编程-1Lambda表达式-3方法引用
Java8引入了Lambda表达式,可以不必编写FunctionalInterface的实现类,直接写Lambda表达式.除了Lambda表达式,我们还可以直接传入方法引用 方法引用是指:如果某个方法 ...
- 廖雪峰Java16函数式编程-2Stream-7其他操作
1. 排序 Stream<T> sorted(); //按元素默认大小排序(必须实现Comparable接口) Stream<T> sorted(Comparator<? ...
- 廖雪峰Java16函数式编程-2Stream-6reduce
1. 聚合方法 Stream.reduce()是一个Stream的聚合方法:把一个Stream的所有元素聚合成一个结果 例如: Stream.of(1, 2, 3, 4, 5).count(); // ...
- 廖雪峰Java16函数式编程-2Stream-5filter
1.filter简介 Stream.filter()是一个转换方法,把一个Stream转换为另一个Stream. 所谓filter操作,就是对一个Stream的所有元素进行测试,不满足条件的元素就被过 ...
- 廖雪峰Java16函数式编程-2Stream-4map
1. map()简介 Stream.map()是一个Stream的转换方法,把一个stream转换为另一个Stream,这2个Stream是按照映射函数一一对应的. 所谓map操作,就是把一种操作运算 ...
- 廖雪峰Java16函数式编程-2Stream-2创建Stream
1. 方法1:把一个现有的序列变为Stream,它的元素是固定的 //1.直接通过Stream.of()静态方法传入可变参数进行创建 Stream<Integer> s = Stream. ...
- 廖雪峰Java16函数式编程-2Stream-1Stream简介
1. Stream Java8引入全新的Stream API 位于java.util.stream包 1.1 Stream API不同于java.io的InputStream/OutputStream ...
- [python学习篇][廖雪峰][2]函数式编程
函数名也是变量: >>> f = abs >>> f(-10) 10 然变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数,这种函数就 ...
- 函数式编程/lambda表达式入门
函数式编程/lambda表达式入门 本篇主要讲解 lambda表达式的入门,涉及为什么使用函数式编程,以及jdk8提供的函数式接口 和 接口的默认方法 等等 1.什么是命令式编程 命令式编程就是我们去 ...
随机推荐
- python输入一个\输出2个\问题
在Python里面,如果\后面不是一个合法的转移字符,那么,Python会打印两个\,换句话说,Python将\也当成普通字符看待,而不是转义符的标志: >>>S = 'C:\py\ ...
- keepAlived主备及双主
nginx用默认配置即可 1.主备配置 1.主keepAlived配置 vrrp_instance VI_1 { state MASTER #主备区分 interface eth0 virtual_r ...
- <%#Eval() %>的常用方法
<%# %>用于数据绑定,通常是用在数据源控件里,比如GridView,Repeater等. 1.绑定Repeater 基础用法 <%# Eval("DriverName& ...
- python png与jpg的相互转换
python将PNG格式的图片转化成为jpg """ 先来说一下jpg图片和png图片的区别 jpg格式:是有损图片压缩类型,可用最少的磁盘空间得到较好的图像质量 png ...
- 【学术篇】规律选手再次证明自己(舒老师的胡策题 T2 LX还在迷路)
只要你不强制在线, 我就能分块. --Reflash 就算你强制在线, 我还是要分块. --Enzymii 今天做了一波舒老师的毒瘤题, T1据说很水但是没思路所以直接放掉了.. 去看了看T2好像可以 ...
- linux 套接字
三.命名套接字 之前的socket只是创建了一个没有名字的资源,其他进程无法访问他.所以也无法从它接受消息.只有当bind给套接字绑定了端口和名字后,其他进程才能找到它. 一般服务器是一定要bind, ...
- requests中text和content的区别
# -*- coding: utf-8 -*- __author__ = "nixinxin" import re img_url = "https://f11.baid ...
- C中为什么不能用==比较字符串?
通常的回答是,==比较的不是字符串的内容,它是在比较指针.或者说,==(或者!=)仅比较两个字符串的首地址,而不会比较字符串每个字符. 那其实接下来应该问的问题是,为什么会只比较首地址呢? 因为早期的 ...
- CSS四种定位及应用
定位(position) 如果,说浮动, 关键在一个 “浮” 字上面, 那么 我们的定位,关键在于一个 “位” 上. PS: 定位是我们CSS算是数一数二难点的了,但是,你务必要学好它,我们CSS离不 ...
- 【优化】碎片OPTIMIZE
来看看手册中关于 OPTIMIZE 的描述: OPTIMIZE [LOCAL | NO_WRITE_TO_BINLOG] TABLE tbl_name [, tbl_name] ... 如果您已经删除 ...