lambda表达式

初级部分

#include<iostream>
using namespace std;

//解决函数嵌套
void main1()
{
	[] {cout << "hello world"; }();//hello world   limbda表达式

	cin.get();
}

void main2()
{
	//auto fun = [] {cout << "hello world"; };//这里fun是一个函数指针
	//fun();//调用
	[] {cout << "hello world"; }();//匿名lambda表达式 最后的()是调用作用

	cin.get();
}

void main3()
{
	//[] {cout << "hello world", cout << "hello boy"; }();//{}是块语句,函数体,执行
	//[](char *str) {cout << str << endl; }("hahaha");
	char str[]{ "fangfang" };
	auto fun = [](char *str) {cout << str << endl; };
	cout << typeid(fun).name() << endl;//class <lambda_...>
	//lambda表达式不能直接取地址,无法当做函数指针
	fun(str);

	cin.get();
}

void main4()
{
	auto fun = [](double a, double b) {return a + b; };
	cout << fun(10, 19.6) << endl;//29.6
	//->在()和{}之间,指定返回值类型
	auto fun1 = [](double a, double b)->int {return a + b; };
	cout << fun1(10, 19.6) << endl;//29
	//内联展开 无法取地址
	//decltype类型自动推理
	auto fun2 = [](double a, double b)->decltype(a+b) {return a + b; };
	cout << fun2(10, 19.6) << endl;

	cin.get();
}

void main()
{
	int num = 100;
	auto fun = [](int num) {num = 5, cout << num << endl; };
	fun(num);//5
	cout << "main=" << num << endl;//100  并未改变,lambda表达式遵循副本机制

	cin.get();
}
深入部分

#include<iostream>
#include<array>
#include<algorithm>//算法
using namespace std;
//主要解决代码内嵌
//[]()->type {}();//匿名表达式
//[],=引用,只读,=mutable,读原本改副本,&读写原本
//()参数,int a,int b
//{}语句的实现  ()调用
//->指定返回值类型

void mainA()
{
	int num1 = 111;
	int num2 = 222;
	//[]() {cout << num1 << num2 << endl; }();//报错
	[=]() {cout << num1 << num2 << endl; }();//[=]捕获外部变量
	//[=]() {num1=20,num2=30,cout << num1 << num2 << endl; }();//报错,[=]只可以读外部变量
	[=]()mutable {num1 = 10, num2 = 30, cout << num1 << num2 << endl; }();//mutable修改副本
	cout << "main= " << num1 << "   " << num2 << endl;//111   222

	[&]() {num1=10,num2=30,cout << num1 << num2 << endl; }();//[&]读写外部变量
	cout << "main1= " << num1 << "   " << num2 << endl;//10   30



	cin.get();
}

void mainB()
{
	//混合机制
	int a = 10;
	int b = 9;
	int c = 8;
	[&a,b,c]() {a=111,cout << a << b << c << endl; }();//只有a可读可写


	cin.get();
}

void mainC()
{
	[](auto a, auto b) {cout << a + b << endl; }(10, 11);
	[](auto a=0, auto b=0) {cout << a + b << endl; }(10, 11);//附初始值只能=不能()
	[](int a = 2, int b = 4) {cout << a + b << endl; }();//6  用auto的话不确定类型

	cin.get();
}

void main()
{
	array<int, 10>myint{ 0,1,2,3,4,5,6,7,8,9 };
	for_each(myint.begin(), myint.end(), [](int num) {cout << num << endl; });//显示
	for_each(myint.begin(), myint.end(), [](int &num) {num+=1,cout << num << endl; });//修改,所有元素+1
	for_each(myint.begin(), myint.end(), [](int num) {cout << num << endl; });//被改变

	cin.get();
}



### Lambda表达式的使用方法和示例 Lambda 表达式是一种简洁的语法形式,用于定义匿名函数或委托。它能够以非常紧凑的方式表示一段可执行逻辑,并且在多种编程语言中得到了广泛应用,例如 Java、C# 和 C++。 #### 基本语法与用法 Lambda 表达式的基本结构通常包括参数列表、箭头符号 `->` 或 `=>` 以及函数体。以下是一些典型的 Lambda 表达式示例: ```java // 无参Lambda表达式 Runnable runnable = () -> { System.out.println("Hello, World!"); }; ``` ```java // 有参Lambda表达式 Function<Integer, String> function = (num) -> "数字是:" + num; ``` ```java // 单行Lambda表达式 Predicate<String> predicate = (s) -> s.length() > 5; ``` 这些示例展示了如何通过 Lambda 表达式简化代码逻辑,使其更加直观和易于维护[^2]。 #### 在实际场景中的应用 Lambda 表达式的一个常见用途是作为参数传递给需要函数式接口的方法,例如在集合操作中进行过滤或映射: ```java public class Demo01Lambda { public static void method(int num, Calcable lambda) { System.out.println(lambda.cal(num)); } public static void main(String[] args) { method(-1314, n -> Math.abs(n)); // 使用Lambda表达式计算绝对值 [^1] } } ``` 在此示例中,Lambda 表达式 `n -> Math.abs(n)` 被用来替代一个单独定义的方法,从而减少了冗余代码并提高了可读性。 #### 与委托结合使用(C#) 在 C# 中,Lambda 表达式可以用来快速定义委托,而无需显式声明方法: ```csharp Func<int, int> square2 = x => x * x; // 使用Lambda表达式定义平方函数 Console.WriteLine(square2(5)); // 输出结果为25 [^3] ``` 这种写法不仅简化了代码结构,还使得逻辑意图更为清晰。 #### 方法引用与参数匹配 当 Lambda 表达式仅调用某个已存在的方法时,可以直接使用方法引用来进一步简化代码: ```java Function<String, Integer> func = String::length; // 正确:将字符串长度方法作为函数引用 ``` 此处的 `String::length` 是对 `String` 类中 `length()` 方法的一种直接引用,它等价于 `(s) -> s.length()`。这种方法引用方式要求被引用方法的参数列表必须与目标函数式接口的抽象方法参数相匹配[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值