iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Java面向对象基础知识之委托和lambda
  • 214
分享到

Java面向对象基础知识之委托和lambda

2024-04-02 19:04:59 214人浏览 八月长安

Python 官方文档:入门教程 => 点击学习

摘要

委托定义类型,类型指定特定方法签名。可将满足此签名的方法(静态或实例)分配给该类型的变量,然后(使用适当参数)直接调用该方法,或将其作为参数本身传递给另一方法再进行调用。以下示例演示

委托定义类型,类型指定特定方法签名。可将满足此签名的方法(静态或实例)分配给该类型的变量,然后(使用适当参数)直接调用该方法,或将其作为参数本身传递给另一方法再进行调用。以下示例演示了委托的用法。


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);行创建特定签名的委托类型,在本例中即接受字符串参数并返回字符串参数的方法。
  • static string ReverseString(string s)方法与定义的委托类型具有完全相同的签名,用于实现委托。
  • Reverse rev = ReverseString;行显示可将方法分配给相应委托类型的变量。
  • Console.WriteLine(rev("a string"));行演示如何使用委托类型的变量来调用委托。

为简化开发过程,.net 包含一组委托类型,程序员可重用这些类型而无需创建新类型。其中包括Func<>Action<>Predicate<>,可用于 .NET api 的各个位置,无需定义新委托类型。当然,从这三者的签名可以看出它们之间存在某些差异,主要影响其既定用途:

  • Action<>用于需要使用委托参数执行操作的情况。
  • Func<>通常用于现有转换的情况,也就是说需要将委托参数转换为其他结果时。最好的示例就是投影。
  • Predicate<>用于需要确定参数是否满足委托条件的情况。也可将其写作Func<T, bool>。

现在可使用Func<>委托而非自定义类型重新编写上述示例。程序将照旧继续运行。


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 引入了匿名委托的概念。在其支持下,可创建“内联”委托,而无需指定任何其他类型或方法。只需在所需位置内联委托的定义即可。

例如,要进行切换并使用匿名委托筛选出只有偶数的列表,然后将其打印到控制台。


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

如你所见,该委托的正文只是一组表达式,其他所有委托也是如此。但它并非单独定义,而是在调用List<T>.FindAll方法时临时引入。

但是,即使使用此方法,仍有许多可以丢弃的代码。此时就需要使用lambda 表达式。

lambda 表达式(或简称“lambda”)在 C# 3.0 中作为语言集成查询的 (LINQ) 核心构建基块被首次引入。这种表达式只是使用委托的更方便的语法。它们将声明签名和方法正文,但在分配到委托之前没有自己的正式标识。与委托不同,可将其作为事件注册的左侧内容或在各种 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。再次强调,它只是使用委托的一种非常方便的语法,因此其实际行为与使用匿名委托时相同。

再次强调,lambda 只是委托,这意味着可将其顺利用作事件处理程序,如以下代码片段所示。


public MainWindow()
{
    InitializeComponent();

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

此上下文中的+=运算符用于订阅事件。

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注编程网的更多内容!

--结束END--

本文标题: Java面向对象基础知识之委托和lambda

本文链接: https://www.lsjlt.com/news/156668.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Java面向对象基础知识之委托和lambda
    委托定义类型,类型指定特定方法签名。可将满足此签名的方法(静态或实例)分配给该类型的变量,然后(使用适当参数)直接调用该方法,或将其作为参数本身传递给另一方法再进行调用。以下示例演示...
    99+
    2024-04-02
  • Java面向对象基础知识之枚举
    目录一、枚举的定义二、枚举的声明三、枚举的转换四、枚举的方法五、标志枚举(二进制枚举)总结一、枚举的定义 枚举是一组命名整型常量。枚举类型是使用enum关键字声明的。 C# 枚举是值...
    99+
    2024-04-02
  • Java面向对象基础知识之抽象类和接口
    抽象类(abstract): 抽象类不能创建实例,它只能作为父类被继承。抽象类是从多个具体类中抽象出来的父类,它具有更高层次的抽象。从多个具有相同特征的类中抽象出一个抽象类,以这个抽...
    99+
    2024-04-02
  • Java面向对象基础知识之数组和链表
    数组的优点: 随机访问性强 查找速度快 数组要求是一块连续的内存空间来存储,这就要求在物理上这一片空间是连续的,每个元素都有指定的索引in...
    99+
    2024-04-02
  • Java面向对象基础知识之封装,继承,多态和抽象
    目录一、封装二、继承三、多态四、抽象总结一、封装 封装:是面向对象方法的重要原则,就是把对象的属性和行为(数据)结合为一个独立的整体,并尽可能隐藏对象的内部实现细节,就是把不想告诉或...
    99+
    2024-04-02
  • Java常见知识点汇总(③)——面向对象基础
    面向对象三要素:封装、继承、多态①. 封装:封装的意义,在于明确标识出允许外部使用的所有成员函数和数据项,或者叫接口。②. 继承:继承基类的方法,并做出自己的扩展;声明某个子类兼容于某基类(或者说,接口上完全兼容于基类),外部调用者可无需关...
    99+
    2023-06-05
  • 〔005〕Java 基础之面向对象
    ✨ 目录 ▷ 面向对象▷ 注意事项▷ this关键字▷ 构造器▷ 重载构造方法▷ 实体类▷ 案例:英雄搜索 ▷ 面向对象 对象: 是一种特殊的数据结构对象: 使用类 new 出来的,有了类就可以创建对象,例...
    99+
    2023-12-22
    java 开发语言 经验分享 极限编程 重载 面向对象
  • Python基础之面向对象基础
    面向对象编程(Object-Oriented Programming,简称OOP)是一种编程思想,它将程序中的数据和操作封装成对象,...
    99+
    2023-09-23
    Python
  • Java基础之从HelloWorld到面向对象
    目录1、 "Hello World!"2、编译与运行3、变量4、数组5、表达式5.1 数学表达式5.2关系表达式5.3 布林表达式5.4 位运算6、控制结构6.1 选择 (if)6....
    99+
    2024-04-02
  • python:面向对象的基本知识
    #类是现实世界或思维世界的实体在计算机中的反映 #它将数据以及这些数据上的操作封装在一起 # 属性-特征 # 方法(函数)-行为 # 构造函数-__init__() 初始化类的特征 构造函数是自动被调用的,...
    99+
    2023-01-31
    基本知识 面向对象 python
  • Java面向对象基础详解
    目录一、前言什么是对象?什么是类?类和对象的关系?类的定义 ?怎么创建对象?格式:创建对象的作用?Phone类下: PhoneDemo下:二、封装封装的好处?Student...
    99+
    2024-04-02
  • 【零基础??天速成 Java】Day2 - 初识面向对象
    目录 前言 1. 可变参数的使用 2. 构造器 3. 包 1、包的创建 2、包的使用 3、包的命名规范 4、常用的包 5. 访问修饰符 6. 继承  7. super 关键字 8. 方法重写 Override 写在最后: 前言 我的 j...
    99+
    2023-09-01
    java
  • Python全栈之面向对象基础
    目录1. 面向对象oop了解2. 对象的相关操作小提示:3. 类的相关操作4. 类对象的删除操作小提示:5. 小练习小提示:答案:总结1. 面向对象oop了解 # ### oop...
    99+
    2024-04-02
  • python基础之函数和面向对象详解
    目录函数函数参数变量作用域内嵌函数和闭包lambda 表达式面向对象三大特性类、类对象 和 实例对象类属性 和 对象属性私有魔法方法基本的魔法方法算术运算符属性访问 描述符...
    99+
    2024-04-02
  • 【Java基础篇 | 面向对象】—— 继承
    个人主页:兜里有颗棉花糖 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 兜里有颗棉花糖 原创 收录于专栏【JavaSE_primary】 本专栏旨在分享学习Java...
    99+
    2023-10-11
    java 开发语言 面向对象
  • Java面向对象基础教学(三)
    目录1.包是什么:2.Java面向对象程序设计三大重要特征:(1)封装:(2)继承extends:(3)多态3.instanceof 运算符 总结1.包是什么: 包相当于文...
    99+
    2024-04-02
  • Java面向对象基础教学(二)
    目录1.使用访问修饰符: 2.static关键字:3.this关键字 总结1.使用访问修饰符:  ...
    99+
    2024-04-02
  • Java面向对象基础教学(一)
    目录1.如何定义类2.如何定义属性3.如何定义普通方法4.如何创建对象5.如何定义构造方法6.什么是可变参数,怎么用?总结1.如何定义类 语法: 访问修饰符 class 类名...
    99+
    2024-04-02
  • JAVA 面向对象之多态的知识点有哪些
    本篇内容介绍了“JAVA 面向对象之多态的知识点有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1. 概念多态是面向对象程序设计(OOP...
    99+
    2023-07-02
  • python基础之面对对象基础类和对象的概念
    简称oop 复习 面向对象编程,简称oop [object oriented programming] 是一种python的编程思想 面...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作