scala05-函数式编程01

函数和方法

package com.zishi.scala.a02.okk05object Test01_FunctionAndMethod {/*** public void main(final String[] args) {*    sayHi$1("alice");  -- 这里调用的就是:sayHi$1*    this.sayHi("bob");*    String result = this.sayHello("cary");*    .MODULE$.println(result);* }** @param args*/def main(args: Array[String]): Unit = {/*** 定义函数* 该函数不能重载** 编译之后的字节码为:* private static final sayHi$1(name: String): Unit =  {*  MODULE$.println((new StringBuilder(4)).append("hi, ").append(name).toString)* }* 增加了修饰符:private static final* 方法名被修改了:sayHi$1** @param name*/def sayHi(name: String): Unit = {println("hi, " + name)}// 不能重载  sayHi is already defined in the scope/*def sayHi(i: Int): Unit = {println("hi, " + i)}*/// 调用函数,不加任何的操作,默认调用函数// 如果没有函数,则调用方法sayHi("alice")  // 这里调用的是函数// 调用对象方法Test01_FunctionAndMethod.sayHi("bob")// 获取方法返回值val result = Test01_FunctionAndMethod.sayHello("cary")println(result)}// 定义对象的方法def sayHi(name: String): Unit = {println("Hi, " + name)}def sayHello(name: String): String = {println("Hello, " + name)return "Hello"}
}

函数的定义

package com.zishi.scala.a02.okk05object Test02_FunctionDefine01 {def main(args: Array[String]): Unit = {//    (1)函数1:无参,无返回值def f1(): Unit = {println("1. 无参,无返回值")}f1()println(f1())println("=========================")//    (2)函数2:无参,有返回值def f2(): Int = {println("2. 无参,有返回值")return 12}println(f2())println("=========================")//    (3)函数3:有参,无返回值def f3(name: String): Unit = {println("3:有参,无返回值 " + name)}println(f3("alice"))println("=========================")//    (4)函数4:有参,有返回值def f4(name: String): String = {println("4:有参,有返回值 " + name)return "hi, " + name}println(f4("alice"))println("=========================")//    (5)函数5:多参,无返回值def f5(name1: String, name2: String): Unit = {println("5:多参,无返回值")println(s"${name1}${name2}都是我的好朋友")}f5("alice", "bob")println("=========================")//    (6)函数6:多参,有返回值def f6(a: Int, b: Int): Int = {println("6:多参,有返回值")return a + b}println(f6(12, 37))}
}

函数的可变参数

package com.zishi.scala.a02.okk05object Test03_FunctionParameter {def main(args: Array[String]): Unit = {//    (1)可变参数def f1(str: String*): Unit = {println(str)}f1("alice") // ArraySeq(alice)f1("aaa", "bbb", "ccc") // ArraySeq(aaa, bbb, ccc)//    (2)如果参数列表中存在多个参数,那么可变参数一般放置在最后def f2(str1: String, str2: String*): Unit = {println("str1: " + str1 + ",str2: " + str2)}// 可变参数不确定,底层实现的方式也不一样f2("alice") // str1: alice,str2: List()f2("aaa", "bbb", "ccc") // str1: aaa,str2: ArraySeq(bbb, ccc)//    (3)参数默认值,一般将有默认值的参数放置在参数列表的后面def f3(name: String = "eeeee"): Unit = {println("My school is " + name)}f3("school")f3()//    (4)带名参数def f4(name: String = "eeeee", age: Int): Unit = {println(s"${age}岁的${name}在smmmca学习")}f4("alice", 20)f4(age = 23, name = "bob")f4(age = 21)}
}

函数的至简原则

package com.zishi.scala.a02.okk05/*** 函数至简原则*/
object Test04_Simplify {def main(args: Array[String]): Unit = {def f0(name: String): String = {return name}println(f0("erfearfere"))println("==========================")//(1)return可以省略,Scala会使用函数体的最后一行代码作为返回值def f1(name: String): String = {name}println(f1("erfearfere"))println("==========================")//(2)如果函数体只有一行代码,可以省略花括号def f2(name: String): String = nameprintln(f2("erfearfere"))println("==========================")//(3)返回值类型如果能够推断出来,那么可以省略(:和返回值类型一起省略)def f3(name: String) = nameprintln(f3("erfearfere"))println("==========================")//    (4)如果有return,则不能省略返回值类型,必须指定//    def f4(name: String) = {//      return name//    }////    println(f4("erfearfere"))println("==========================")//(5)如果函数明确声明unit,那么即使函数体中使用return关键字也不起作用def f5(name: String): Unit = {return name}println(f5("f5 erfearfere"))println("==========================")/***(6)Scala如果期望是无返回值类型,可以省略等号* =号省略的前提是 没有返回值* @param name*/def f6(name: String) {println(name)}println(f6("f6 erfearfere"))println("==========================")//(7)如果函数无参,但是声明了参数列表,那么调用时,小括号,可加可不加def f7(): Unit = {println("f7")}f7()f7println("==========================")//(8)如果函数没有参数列表,那么小括号可以省略,调用时小括号必须省略def f8: Unit = {println("f8  f8")}/*** 省略参数列表的小括号* 省略返回值类型* 省略方法体的花括号*/def f82 = println("f8  f8")f82//f8()f8println("==========================")//(9)如果不关心名称,只关心逻辑处理,那么函数名(def)可以省略def f9(name: String): Unit = {println(name)}// 匿名函数,lambda表达式,无参函数() => {println("Hello lambda")}// 匿名函数,lambda 表达式,这里是有参函数(name: String) => {println(s"aaa ${name}", name)}println("-------------------")}
}

函数也是对象

package com.zishi.scala.a02.okk05/*** 函数至简原则*/
object Test04_Simplify02 {def main(args: Array[String]): Unit = {/*** Scala是面向对象的语言,万物皆对象,* 所以函数也是对象** 既然函数是对象,* 1. 那么函数这个对象应该有类型,* 2. 并且可以赋值给其他人使用*/def test() = {println("111")}// 调用了test函数,可以省略小括号test//打印函数返回结果,Unit结果是()println(test)// 打印了test对象 com.zishi.scala.okk05.Test05_Lambda$$$Lambda$16/0x00000008000d7840@41ee392bprintln(test _)// 函数对象test赋值给一个变量f2// 函数的类型为:Function0[Unit]// 0表示函数参数列表为0// Unit表示函数的返回值为Unit// val f2: Function0[Unit] = test _// 这是 val f2: Function0[Unit] = test _的变形// () => Unit 表示函数f2的类型val f2: () => Unit = test _println(f2) //com.zishi.scala.okk05.Test04_Simplify02$$$Lambda$17/0x00000008000d7c40@57d5872cprintln("...........")f2() // 函数调用// 增加难度def test1(age: Int): String = {"hello:" + age}//函数的类型为:Function1[Int, String]// 1表示函数参数列表为1个// [Int, String]中Int表示函数的参数列表是Int,String表示返回值是String:// 函数对象的参数最多22个val f3: Function1[Int, String] = test1// f4 的函数类型为:(Int) => String, 输入一个Int,返回一个String// TODO: 这是另外一种表示形式  Function1[Int, String] 等价于 (Int) => Stringval f4: (Int) => String = test1println(f3) // com.zishi.scala.okk05.Test04_Simplify02$$$Lambda$18/0x00000008000d6840@36f0f1beprintln(f4) // com.zishi.scala.okk05.Test04_Simplify02$$$Lambda$19/0x00000008000d6040@6ee12bacf4(4) // 这里是方法调用,  类似Java中的对象调用方法: user.xxxx}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/777675.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何在Flutter中进行网络请求?

Hello!大家好,我是咕噜铁蛋,你们的好朋友!今天,我想和大家分享一下在Flutter中如何进行网络请求。Flutter作为一个跨平台的开发框架,网络请求是其实现数据交互的重要一环。下面,我将详细介绍几种…

构建一个基础的大型语言模型(LLM)应用程序

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

docker部署-RabbitMq

1. 参考 RabbitMq官网 docker官网 2. 拉取镜像 这里改为自己需要的版本即可,下面容器也需要同理修改 docker pull rabbitmq:3.12-management3. 运行容器 docker run \ --namemy-rabbitmq-01 \ -p 5672:5672 \ -p 15672:15672 \ -d \ --restart always \ -…

java算法day37 | 贪心算法 part06 ● 738.单调递增的数字 ● 968.监控二叉树

738.单调递增的数字 思路: 从后向前遍历,如果前一个数比后一个数大,则前一个数-1,后面的数都变成9. 思路不难,但实现的代码还是有一点繁琐的。 以下是用List实现的代码。 class Solution {public int monotoneIncrea…

【群晖】部署UptimeKuma监控服务

【群晖】部署UptimeKuma监控服务 点击标题查看原文 本文讲解在群晖系统中使用docker方式部署UptimeKuma服务并通过外网地址正确访问 配置及版本 DSM:7.2(7.x以上均可) UptimeKuma:louislam/uptime-kuma:latest 安装 docker中下…

Switch 和 PS1 模拟器:3000+ 游戏随心玩 | 开源日报 No.174

Ryujinx/Ryujinx Stars: 26.1k License: MIT Ryujinx 是用 C# 编写的实验性任天堂 Switch 模拟器。 该项目旨在提供出色的准确性和性能、用户友好的界面以及稳定的构建。它已经通过了大约 4050 个测试,其中超过 4000 个可以启动并进入游戏,其中大约 340…

【DevOps基础篇】Proxy的工作原理

目录 代理服务器的类型正向代理正向代理的用例反向代理反向代理的例子推荐超级课程: Docker快速入门到精通Kubernetes入门到大师通关课AWS云服务快速入门实战代理服务器充当客户端请求资源和提供资源的服务器之间的中介。它可以用于各种目的,如缓存资源以加快访问速度,匿名化…

SpringBoot+ElasticSearch实现文档内容抽取、高亮分词、全文检索

需求 产品希望我们这边能够实现用户上传PDF、WORD、TXT之内得文本内容,然后用户可以根据附件名称或文件内容模糊查询文件信息,并可以在线查看文件内容。 一、环境 项目开发环境: 后台管理系统springbootmybatis_plusmysqles 搜索引擎&#…

Java中的NIO(非阻塞IO)

Java中的NIO(Non-blocking I/O,非阻塞IO)是Java IO API的一个改进版,为所有的原始数据访问提供了一个新的通道(Channel)接口。NIO与原来的IO有同样的作用和目的,但是使用的方式完全不同&#xf…

springdata框架对es集成

什么是spring data框架 Spring Data是一个用于简化数据库、非关系型数据库、索引库访问,并支持云服务的开源框架。其主要目标是使得对数据的访问变得方便快捷,并支持 map-reduce框架和云计算数据服务。Spring Data可以极大的简化JPA(Elasticsearch…)的…

《享元模式(极简c++)》

本文章属于专栏- 概述 - 《设计模式(极简c版)》-CSDN博客 模式说明 方案:享元模式是一种结构型设计模式,旨在通过共享尽可能多的对象来最小化内存使用和提高性能。 优点 减少内存占用:通过共享相似对象的状态&#xf…

ssh 公私钥(github)

一、生成ssh公私钥 生成自定义名称的SSH公钥和私钥对,需要使用ssh-keygen命令,这是大多数Linux和Unix系统自带的标准工具。下面,简单展示如何使用ssh-keygen命令来生成具有自定义名称的SSH密钥对。 步骤 1: 打开终端 首先,打开我…

对话 Mines of Dalarnia: Web3 游戏创新,社区驱动与公链共建

作者:stellafootprint.network 嘉宾:Manfred Pack,Mines of Dalarnia 游戏开发总监 采访者:Alex Cooper,Footprint Analytics 北美社区与 BD 负责人 在区块链游戏领域,去中心化和玩家经济正在颠覆传统游戏…

泛型,数据结构,集合

文章目录 泛型介绍解决问题好处使用通配符泛型的下限泛型的上限 数据结构定义常见的数据结构栈(先进后出)队列(先进先出)数组结构链表结构哈希表结构 集合List集合特点特有方法子类及其底层数据结构LinkedList集合 Set集合特点没有特有方法子类及其底层数据结构LinkedHashSet集…

vscode使用sftp上传

1.用vscode打开项目 2.安装一下这个sftp 3.使用快捷键 ctrlshiftP 打开指令窗口,输入 sftp:config,选中回车,在当前目录中会自动生成 .vscode 文件夹及 sftp.json 4.修改sftp.json文件配置,改成以下(默认的参数可能上传…

AJAX-项目优化(目录、基地址、token、请求拦截器)

目录管理 基地址存储 在utils/request.js配置axios请求基地址 作用&#xff1a;提取公共前缀地址&#xff0c;配置后axios请求时都会baseURLurl 填写API的公共前缀后&#xff0c;将js文件导入到html文件中 <script src"../../utils/request.js"></script&…

SpringBoot单元测试剖析

SpringBoot作为一种流行的Java框架&#xff0c;其单元测试的重要性不言而喻。在这篇博客中&#xff0c;我们将深入剖析SpringBoot单元测试的底层原理。 单元测试的概念 单元测试是软件开发过程中的一个重要环节&#xff0c;它是对软件中的最小可测试单元进行检查和验证。对于…

AI新工具 又一个开源大模型DBRX击败GPT3.5;根据音频和图像输入生成会说话、唱歌的动态视频

✨ 1: AniPortrait 腾讯开源&#xff1a;根据音频和图像输入生成会说话、唱歌的动态视频 AniPortrait 是个先进的框架&#xff0c;专门用来生成高质量的、由音频和参考肖像图片驱动的动画。如果你有视频&#xff0c;也可以用来实现面部的再现&#xff08;Face reenactment&am…

【氮化镓】位错对氮化镓(GaN)电子能量损失谱(EEL)的影响

本文献《Influence of dislocations on electron energy-loss spectra in gallium nitride》由C. J. Fall等人撰写&#xff0c;发表于2002年。研究团队通过第一性原理计算&#xff0c;探讨了位错对氮化镓&#xff08;GaN&#xff09;电子能量损失谱&#xff08;EEL&#xff09;…

内网穿透_ICMP_icmpsh

目录 一、ICMP协议详解 二、ICMP隧道 (一) 为什么会使用ICMP (二) 实验环境 (三) 操作流程 1. 下载icmpsh 2. 下载并安装依赖 3. 关闭本地icmp响应 4. 攻击机启动服务端开始监听 5. 靶机启动工具客户端 6. 攻击机接受到靶机传来的数据 三、郑重声明 一、ICMP协议详…