最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java面向?qū)ο蠡A(chǔ)知識之委托和lambda

 更新時間:2021年11月08日 09:43:30   作者:一指流砂~  
這篇文章主要介紹了Java面向?qū)ο蟮闹泻?lambda,文中有非常詳細的代碼示例,對正在學習java基礎(chǔ)的小伙伴們有很好的幫助,需要的朋友可以參考下

委托定義類型,類型指定特定方法簽名??蓪M足此簽名的方法(靜態(tài)或?qū)嵗┓峙浣o該類型的變量,然后(使用適當參數(shù))直接調(diào)用該方法,或?qū)⑵渥鳛閰?shù)本身傳遞給另一方法再進行調(diào)用。以下示例演示了委托的用法。

using System;
using System.Linq;

public class Program
{
    public delegate string Reverse(string s);

    static string ReverseString(string s)
    {
        return new string(s.Reverse().ToArray());
    }

    static void Main(string[] args)
    {
        Reverse rev = ReverseString;

        Console.WriteLine(rev("a string"));
    }
}
  • public delegate string Reverse(string s);行創(chuàng)建特定簽名的委托類型,在本例中即接受字符串參數(shù)并返回字符串參數(shù)的方法。
  • static string ReverseString(string s)方法與定義的委托類型具有完全相同的簽名,用于實現(xiàn)委托。
  • Reverse rev = ReverseString;行顯示可將方法分配給相應委托類型的變量。
  • Console.WriteLine(rev("a string"));行演示如何使用委托類型的變量來調(diào)用委托。

為簡化開發(fā)過程,.NET 包含一組委托類型,程序員可重用這些類型而無需創(chuàng)建新類型。其中包括Func<>Action<>Predicate<>,可用于 .NET API 的各個位置,無需定義新委托類型。當然,從這三者的簽名可以看出它們之間存在某些差異,主要影響其既定用途:

  • Action<>用于需要使用委托參數(shù)執(zhí)行操作的情況。
  • Func<>通常用于現(xiàn)有轉(zhuǎn)換的情況,也就是說需要將委托參數(shù)轉(zhuǎn)換為其他結(jié)果時。最好的示例就是投影。
  • Predicate<>用于需要確定參數(shù)是否滿足委托條件的情況。也可將其寫作Func<T, bool>。

現(xiàn)在可使用Func<>委托而非自定義類型重新編寫上述示例。程序?qū)⒄张f繼續(xù)運行。

using System;
using System.Linq;

public class Program
{
    static string ReverseString(string s)
    {
        return new string(s.Reverse().ToArray());
    }

    static void Main(string[] args)
    {
        Func<string, string> rev = ReverseString;

        Console.WriteLine(rev("a string"));
    }
}

對于此簡單示例而言,在Main方法之外定義方法似乎有些多余。因此 .NET Framework 2.0 引入了匿名委托的概念。在其支持下,可創(chuàng)建“內(nèi)聯(lián)”委托,而無需指定任何其他類型或方法。只需在所需位置內(nèi)聯(lián)委托的定義即可。

例如,要進行切換并使用匿名委托篩選出只有偶數(shù)的列表,然后將其打印到控制臺。

using System;
using System.Collections.Generic;

public class Program
{
    public static void Main(string[] args)
    {
        List<int> list = new List<int>();

        for (int i = 1; i <= 100; i++)
        {
            list.Add(i);
        }

        List<int> result = list.FindAll(
          delegate (int no)
          {
              return (no % 2 == 0);
          }
        );

        foreach (var item in result)
        {
            Console.WriteLine(item);
        }
    }
}

如你所見,該委托的正文只是一組表達式,其他所有委托也是如此。但它并非單獨定義,而是在調(diào)用List<T>.FindAll方法時臨時引入。

但是,即使使用此方法,仍有許多可以丟棄的代碼。此時就需要使用lambda 表達式。

lambda 表達式(或簡稱“l(fā)ambda”)在 C# 3.0 中作為語言集成查詢的 (LINQ) 核心構(gòu)建基塊被首次引入。這種表達式只是使用委托的更方便的語法。它們將聲明簽名和方法正文,但在分配到委托之前沒有自己的正式標識。與委托不同,可將其作為事件注冊的左側(cè)內(nèi)容或在各種 LINQ 子句和方法中直接分配。

由于 lambda 表達式只是指定委托的另一種方式,因此應可重新編寫上述示例,令其使用 lambda 表達式而不是匿名委托。

using System;
using System.Collections.Generic;

public class Program
{
    public static void Main(string[] args)
    {
        List<int> list = new List<int>();

        for (int i = 1; i <= 100; i++)
        {
            list.Add(i);
        }

        List<int> result = list.FindAll(i => i % 2 == 0);

        foreach (var item in result)
        {
            Console.WriteLine(item);
        }
    }
}

在前面的示例中,所使用的 Lambda 表達式為i => i % 2 == 0。再次強調(diào),它只是使用委托的一種非常方便的語法,因此其實際行為與使用匿名委托時相同。

再次強調(diào),lambda 只是委托,這意味著可將其順利用作事件處理程序,如以下代碼片段所示。

public MainWindow()
{
    InitializeComponent();

    Loaded += (o, e) =>
    {
        this.Title = "Loaded";
    };
}

此上下文中的+=運算符用于訂閱事件。

總結(jié)

本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!

相關(guān)文章

  • Java中String性能優(yōu)化

    Java中String性能優(yōu)化

    本文給大家分享的是如何在java中對String進行性能優(yōu)化,使用String的時候需要有哪些注意事項呢,這就是今天我們要給大家總結(jié)分析的,有需要的小伙伴可以參考下。
    2015-03-03
  • Java ThreadLocal的設(shè)計理念與作用

    Java ThreadLocal的設(shè)計理念與作用

    這篇文章主要介紹了Java ThreadLocal的設(shè)計理念與作用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-03-03
  • Elasticsearch?計數(shù)分詞中的token使用實例

    Elasticsearch?計數(shù)分詞中的token使用實例

    這篇文章主要為大家介紹了Elasticsearch?計數(shù)分詞中的token使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-01-01
  • spring cloud hystrix 超時時間使用方式詳解

    spring cloud hystrix 超時時間使用方式詳解

    這篇文章主要介紹了spring cloud hystrix 超時時間使用方式,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-01-01
  • SpringMVC獲取請求參數(shù)的方法詳解

    SpringMVC獲取請求參數(shù)的方法詳解

    這篇文章主要為大家詳細介紹了SpringMVC中獲取請求參數(shù)的方法,例如通過ServletAPI獲取和通過控制器方法的形參獲取請求參數(shù)等,需要的可以參考下
    2023-07-07
  • java調(diào)用WebService服務的四種方法總結(jié)

    java調(diào)用WebService服務的四種方法總結(jié)

    WebService是一種跨編程語言、跨操作系統(tǒng)平臺的遠程調(diào)用技術(shù),已存在很多年了,很多接口也都是通過WebService方式來發(fā)布的,下面這篇文章主要給大家介紹了關(guān)于java調(diào)用WebService服務的四種方法,需要的朋友可以參考下
    2021-11-11
  • Java后臺基于POST獲取JSON格式數(shù)據(jù)

    Java后臺基于POST獲取JSON格式數(shù)據(jù)

    這篇文章主要介紹了Java后臺基于POST獲取JSON格式數(shù)據(jù),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-03-03
  • Spring中BeanUtils.copyProperties的坑及解決

    Spring中BeanUtils.copyProperties的坑及解決

    這篇文章主要介紹了Spring中BeanUtils.copyProperties的坑及解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • JDK輸入命令Javac報錯的解決方法

    JDK輸入命令Javac報錯的解決方法

    相信很多人都經(jīng)歷過配置環(huán)境變量失敗的經(jīng)歷,尤其是很多時候明明按照老師教的步驟或者教程上的方法循規(guī)守矩配置卻還是出錯,下面我們來解決一個非常蹊蹺的問題---輸入Java和Java -version都沒問題,但是輸入Javac報錯,感興趣的朋友一起看看吧
    2023-11-11
  • SpringBoot使用Kafka來優(yōu)化接口請求的并發(fā)方式

    SpringBoot使用Kafka來優(yōu)化接口請求的并發(fā)方式

    這篇文章主要介紹了SpringBoot使用Kafka來優(yōu)化接口請求的并發(fā)方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-07-07

最新評論

祁门县| 安阳县| 北海市| 吴忠市| 上思县| 永春县| 衡南县| 牙克石市| 浙江省| 马尔康县| 宿州市| 观塘区| 宿州市| 岑巩县| 长寿区| 清远市| 鄂尔多斯市| 平陆县| 广平县| 晋宁县| 丰城市| 固安县| 潜江市| 怀宁县| 太康县| 吉安县| 嵩明县| 自治县| 游戏| 兴业县| 徐汇区| 宜川县| 靖西县| 玉环县| 民勤县| 宝鸡市| 磴口县| 普陀区| 雷山县| 莱西市| 鹤山市|