Lamdba-函数式编程《一》

本文介绍Java中的Lambda表达式及其应用,包括重要的函数接口如Predicate、Consumer、Function等,探讨Lambda表达式的变种写法及类型推断,并通过实例帮助理解。

Lamdba-函数式编程《一》

Java中重要的函数接口

接口参数返回类型事例
PredicateTboolean是否通过测试
ConsumerTvoid输出一个值
FunctionTR获取一个R类型的返回值
SupplierNoneT工厂方法
UnaryOperatorTT逻辑非(!)
BinaryOperator(T,T)T求两个数的和或者乘积

Lambda表达式辨别

表达式变种写法:

1. Runnable noArguments = () ->System.out.println("Hello World");
2.ActionListener oneArgument = event -> System.out.println("Hello World");
3. Runnable multiStatement = () ->{
System.out.println("Hello");
System.out.println("World");
}
4.BinaryOpterator<Long> add = (x,y) -> x+y;
5.BinaryOpterator<Long> add = (Long x,Long y) -> x+y;

()代表无参数。{} 可以用于代码块 4/5的写法由于4的写法可以被上下文环境解析编译器推断出的,给予默认值。

Lambda表达式是引用值,不是变量

尝试在main方法中编写如下代码你会发现,编译器会有何提示?强制运行之后会提示什么?

Integer initNum =0;
// 此处如果对initNum做了值操作,那么编译器首先会报错,
//提示:变量在lambda中使用 必须是final的或者既成事实的final 
Runnable runnable = () -> System.out.println(initNum++);
runnable.run();

由上述例子可以得出:lambda引用的是值,不是变量,虽然java8 没有强制要求写上final关键字,但是实际上相当于编译过程程序自动添加了。没强制添加,只是增加了代码的可读性吧。这也就是为什么Lambda表达式也被称之为闭包的原因。

Lambda类型推断

早在Java7的时候 类型推断就已经存在,如:

12的效果完全一致,map1中采用菱形<>操作符进行类型推断
Map<String, Integer> map1 = new HashMap<>();
Map<String, Integer> map2 = new HashMap<String, Integer>();

下面做一个事例:

 Predicate<Integer> result = x -> x > 5;
 System.out.println(result.test(7));

Predicate接口源码,接受一个对象,返回一个布尔值

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);

接口示意图:

T -Predicate-boolean
Predicate只有一个范型类型参数,Lambda表达式实现了该接口,所以单一参数被推断为Integer.

在 Python 中,`lambda` 是个关键字,用于匿名函数。所谓匿名函数,就是没有函数名的函数。其语法形式如下: ``` lambda arguments: expression ``` 其中,`arguments` 表示函数的参数列表,可以是多个参数,用逗号隔开;`expression` 则是函数体,是个表达式,返回值即为该函数的返回值。 `lambda` 函数的作用是可以快速定义个简单的函数,特别是在需要传递函数作为参数时非常有用。例如,我们可以使用 `lambda` 函数来对列表进行排序: ``` >>> lst = [(1, 2), (4, 1), (3, 3)] >>> sorted(lst, key=lambda x: x[1]) [(4, 1), (1, 2), (3, 3)] ``` 上面的代码中,`sorted()` 函数的 `key` 参数指定了排序规则,使用了个 `lambda` 函数来指定按元组的第二个元素进行排序。 除此之外,`lambda` 函数还可以用于函数式编程中的些高阶函数,例如 `map()`、`filter()` 等。这些函数可以接受函数作为参数,对可迭代对象进行处理,并返回新的可迭代对象。使用 `lambda` 函数可以方便地定义这些处理函数,例如: ``` >>> lst = [1, 2, 3, 4, 5] >>> list(map(lambda x: x * 2, lst)) [2, 4, 6, 8, 10] >>> list(filter(lambda x: x % 2 == 0, lst)) [2, 4] ``` 上面的代码中,`map()` 函数和 `filter()` 函数都使用了个 `lambda` 函数来定义处理规则。`map()` 函数对列表中的每个元素都乘以 2,`filter()` 函数则筛选出列表中的偶数。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值