网站首页 > 技术文章 正文
技术/杨33
一、什么是Lambda表达式
Lambda表达式,即函数式编程。
函数接口:有且仅有一个抽象方法的接口。
二、使用Lambda表达式的优点和缺点
1、优点
- 可以减少代码的体积,减少匿名内部类的创建,节省内存空间
- 使用时不用去记忆所使用的接口和抽象函数
2、缺点
- 易读性较差,阅读代码的人需要熟悉Lambda表达式和抽象函数中参数的类型
- 不方便调试
三、Lambda表达式的语法
Lambda表达式在Java语言中引入了一种新的语法元素和操作符,它就是“->”,该操作符被称为Lambda操作符或者箭头操作符。它将Lambda表达式分为左右两部分:
- 左侧:指定了Lambda表达式需要的所有参数
- 右侧:指定了要执行的Lambda表达式体
语法格式如下:
1、参数的数据类型可以省略不写,因为编译器可以通过上下文推断出来
2、无参、无返回值,Lambda体只需一条语句
Runnable runnable = () -> System.out.println("hello lambda");
3、一个参数
Closure closure = (x) -> System.out.println(x);
4、一个参数时,小括号可以省略
Closure closure = x -> System.out.println(x);
5、两个参数,有返回值
Comparator<Integer> tComparator = (x, y) -> {
return Integer.compare(x, y);
};
6、Lambda体只有一条语句时,return和大括号可以省略
Comparator<Integer> tComparator = (x, y) -> Integer.compare(x, y);
四、自定义函数接口
只需编写只有一个抽象方法的接口即可,代码中的@FunctionalInterface是可选的,但加上该标注编译器会帮你检查接口是否符合函数接口规范。
@FunctionalInterface
public interface DemoService<T> {
void test(T t);
}
使用自定义的函数接口代码如下:
DemoService<String> demoService = str -> System.out.println(str);
demoService.test("自定义函数接口");
五、Java内置的四大核心函数接口
1、Consumer<T> 消费型接口
例如:对类型为”张三“的字符串应用操作。
@org.junit.Test
public void lam() {
demo("张三", s -> System.out.println("你好," + s));
public void demo(String str, Consumer<String> consumer) {
consumer.accept(str);
}
2、Supplier<T> 供给型接口Function<T, R> 函数型接口
@org.junit.Test
public void lam() {
List<Integer> numList = getNumList(1, () -> (int) (Math.random() * 10));
//输出0到10之间的随机的一个整数
for (Integer i : numList) {
System.out.println(i);
}
}
public List<Integer> getNumList(int num, Supplier<Integer> supplier) {
List<Integer> list = new ArrayList<>();
for (int i = 0; i < num; i++) {
Integer integer = supplier.get();
list.add(integer);
}
return list;
}
3、Function<T, R> 函数型接口
@org.junit.Test
public void lam() {
String string = setString("这是函数型接口", s -> s.substring(0, 2));
System.out.println(string);
}
public String setString(String str, Function<String, String> function) {
return function.apply(str);
}
4、Predicate<T> 断定型接口
@org.junit.Test
public void lam() {
System.out.println(com(3, a -> a > 2));
}
public boolean com(int a, java.util.function.Predicate<Integer> predicate) {
return predicate.test(a);
}
六、除了内置的四大核心函数接口外,Java还提供了一些其他的接口
七、Lambda表达式的方法引用
方法引用,使用的前提条件是什么呢?
- 方法引用所引用的方法的参数列表必须要和函数式接口中抽象方法的参数列表相同(完全一致)。
- 方法引用所引用的方法的的返回值必须要和函数式接口中抽象方法的返回值相同(完全一致)。
方法引用的3种语法格式分别如下:
1、对象::实例方法
@org.junit.Test
public void lam() {
User user = new User("张三", 18, "女");
Supplier<String> supplier = user::getName;
System.out.println(supplier.get());
}
2、类名::静态方法名
@org.junit.Test
public void lam() {
Supplier<String> supplier = User::getInfo;
System.out.println(supplier.get());
}
3、类::实例方法
@org.junit.Test
public void lam() {
BiPredicate<String, String> predicate = String::equals;
System.out.println(predicate.test("a", "b"));
}
八、Lambda表达式的构造器引用
构造器使用的前提是什么?
- 构造器参数列表要与函数接口中抽象方法的参数列表一致!
构造器引用的语法格式如下:
类名 :: new
@org.junit.Test
public void lam() {
BiConsumer<String, Integer> biConsumer = User::new;
biConsumer.accept("李四", 18);
}
下一篇文章中,会写Lambda表达式在Java集合框架中的应用
作者:杨33,北京互联网公司在职Java开发,专注分享写作干货。欢迎关注我,期待你的点赞评论。
猜你喜欢
- 2024-11-16 3.1 Python高级编程-函数式编程工具
- 2024-11-16 面向对象编程的一些思考(面向对象编程的理解)
- 2024-11-16 知识总结-Java8 Stream函数式编程
- 2024-11-16 bind、call、apply 区别?如何实现一个bind?
- 2024-11-16 Javascript基础重拾笔记之手写apply、call
- 2024-11-16 java 8新特性 常用内置函数式接口
- 2024-11-16 7、JavaScript 内置的常用对象有哪些?该对象常用的方法(必会)
- 2024-11-16 Java中“::”是什么含义(java中+是什么)
- 2024-11-16 Java 8 中的 Function:让代码从繁琐到简洁的魔法工具
- 2024-11-16 13万字详细分析JDK中Stream的实现原理(中)
- 标签列表
-
- content-disposition (47)
- nth-child (56)
- math.pow (44)
- 原型和原型链 (63)
- canvas mdn (36)
- css @media (49)
- promise mdn (39)
- readasdataurl (52)
- if-modified-since (49)
- css ::after (50)
- border-image-slice (40)
- flex mdn (37)
- .join (41)
- function.apply (60)
- input type number (64)
- weakmap (62)
- js arguments (45)
- js delete方法 (61)
- blob type (44)
- math.max.apply (51)
- js (44)
- firefox 3 (47)
- cssbox-sizing (52)
- js删除 (49)
- js for continue (56)
- 最新留言
-