1. 程式人生 > 其它 >Java基礎-03(02).總結運算子、鍵盤錄入、if語句

Java基礎-03(02).總結運算子、鍵盤錄入、if語句

Lambda基礎

可呼叫物件(callable object):函式、函式指標、過載了函式呼叫運算子的類(即operator())、Lambda表示式;呼叫方法即 f(args)

一個lambda表示式表示一個可呼叫的程式碼單元,可以將其理解為一個匿名的inline函式。其形式為:[捕獲列表](引數列表) -> 返回型別 { 函式體 }

  • 引數列表和返回型別可以忽略。(1)若存在引數列表:不能有預設引數,即實參與形參的數量相同。(2)若忽略返回型別:函式體只有一個return語句時,lambda通過表示式的型別而推斷返回型別;函式體還有其他內容時,返回void
  • 示例:auto f = [] { return 1; }; cout << f() << endl;

捕獲列表

Lambda表示式通常用在函式內部,但是它只能使用外部的全域性變數,如果想要使用函式內部的某些區域性變數就需要將它們加入到捕獲列表中,比如:

int main()
{
    int a = 1, b = 2;
    auto f = [a, b] () -> int { return a+b; };
    std::cout << f() << std::endl;
    return 0; 
}

三種捕獲方式:
值捕獲:(1)前提必須是變數可以拷貝。(2)被捕獲的變數的值是在lambda建立時拷貝,而不是呼叫時拷貝。
引用捕獲:由於lambda捕獲的區域性變數在函式結束後就不再存在,所以要確保被引用的物件在呼叫lambda時是存在的。
隱式捕獲

[=]表示lambda使用的所有來自所在函式的實體均採用值捕獲;[&]表示lambda使用的所有來自所在函式的實體均採用引用捕獲。同時使用:[&, 值捕獲列表]以及[=, 引用捕獲列表]

兩個例子:(能不能修改取決於變數是否為const)

  1. 通過mutable關鍵字來改變值捕獲變數的值
int main()
{
    int v = 1;
    auto f = [v] () mutable -> int { ++v; return v; };
    std::cout << f() << std::endl;  // 輸出2
    return 0; 
}
  1. 如果是引用捕獲,直接可以修改
int main()
{
    int v = 1;
    auto f = [&v] () -> int { ++v; return v; };
    std::cout << f() << std::endl;  // 輸出2
    return 0; 
}