kotlin基础之lambda编程

在Kotlin中,Lambda表达式是一种非常强大的工具,允许我们以更简洁、更声明式的方式编写代码。Kotlin对集合的操作提供了丰富的函数式API,这使得处理集合数据变得更加直观和高效。以下是如何在Kotlin中使用Lambda表达式、集合的创建与遍历以及集合的函数式API的示例。

1. 集合的创建与遍历

集合的创建

在Kotlin中,你可以使用listOf()setOf()mapOf()等函数来快速创建列表、集合和映射。

// 创建列表
val list = listOf(1, 2, 3, 4, 5)
// 创建集合
val set = setOf(1, 2, 3, 4, 5) // 注意集合中的元素是唯一的
// 创建映射(Map)
val map = mapOf("key1" to "value1", "key2" to "value2")
集合的遍历

你可以使用forEach函数来遍历集合中的元素。

// 遍历列表
list.forEach { element ->
println(element)
}
// 简化Lambda表达式(如果Lambda只有一个参数并且它是最后一个参数,可以省略大括号和箭头)
list.forEach { println(it) } // 在这里,'it'是默认的参数名

2. 集合的函数式API

Kotlin为集合提供了许多函数式API,如filter()map()reduce()flatMap()等。

filter

filter函数接受一个Lambda表达式作为参数,并返回一个新集合,其中只包含满足Lambda表达式条件的元素。

val evenNumbers = list.filter { it % 2 == 0 } // 过滤出偶数
evenNumbers.forEach { println(it) }
map

map函数接受一个Lambda表达式作为参数,并返回一个新集合,其中包含应用Lambda表达式到原始集合每个元素的结果。

val squares = list.map { it * it } // 计算每个元素的平方
squares.forEach { println(it) }
reduce

reduce函数接受一个Lambda表达式(二元操作符)作为参数,并返回一个值,该值是通过对集合中的元素连续应用此Lambda表达式而计算得出的。

val sum = list.reduce { acc, element -> acc + element } // 计算列表的总和
println(sum)
// 或者使用内置操作符(如果Lambda表达式很简单)
val sumSimplified = list.reduce { acc, e -> acc + e }
println(sumSimplified)
// 更简洁的写法,使用sumBy函数
val sumBy = list.sumBy { it }
println(sumBy)

3. Java函数式API的使用

虽然Kotlin有自己的函数式API,但它也可以与Java的函数式接口(如PredicateFunctionConsumer等)和Stream API一起使用。但是,由于Kotlin的Lambda语法更加简洁和直观,因此通常建议使用Kotlin的函数式API。

然而,如果你需要与Java代码互操作或使用Java库,你可以这样做:

// 使用Java的Stream API和Lambda表达式
import java.util.stream.Collectors
import java.util.Arrays
val javaList = Arrays.asList(1, 2, 3, 4, 5)
val evenJavaList = javaList.stream()
.filter { it % 2 == 0 } // 这里我们仍然使用Kotlin的Lambda语法
.collect(Collectors.toList()) // 收集结果到新的列表中
evenJavaList.forEach { println(it) }

在这个例子中,我们使用了Java的Arrays.asList()来创建一个Java列表,并使用Java的Stream API来过滤偶数。但是,请注意,在Lambda表达式中,我们仍然使用了Kotlin的语法。这是因为Kotlin的Lambda表达式与Java的Lambda表达式在语法上非常相似,可以互换使用。

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

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

相关文章

ubuntu nginx 配置php 网站

1.安装nginx sudo apt-get install nginx 2.安装php 和php-fpm sudo apt-get install phpsudo apt-get install php-fpm 3.配置ngixn 进入/etc/nginxg/sites-enabled vim default //notice 这里只能有一个default的文件 放两个nginx会把报错 完整配置如下 ## # You sho…

go语言之基本数据类型

文章目录 基础数据类型分类整数类型有符号整数无符号整数默认整数类型 浮点类型复数类型布尔类型字符类型字符串replace字符串获取字符串长度字符串的拼接字符串获取指定位置字符更多string操作 数据类型之间的转换其它基本类型转字符串类型fmt包中的Sprintfstrconv包中函数 字…

开源与闭源:AI模型发展的双重路径之争

前言 随着人工智能(AI)技术的飞速发展,AI模型的应用已经渗透到各行各业,从医疗、金融到制造、教育,无不受到AI技术的深刻影响。在讨论一个AI模型“好不好”“有没有发展”时,绕不过“开源”和“闭源”两条…

java 解决异常 Class path contains multiple SLF4J bindings

前面 为了使用 j2cache pom中导入了 <dependency><groupId>net.oschina.j2cache</groupId><artifactId>j2cache-core</artifactId><version>2.8.4-release</version> </dependency><dependency><groupId>net.osc…

2020 年 12 月青少年软编等考 C 语言二级真题解析

目录 T1. 数组指定部分逆序重放思路分析 T2. 简单密码思路分析 T3. 错误探测思路分析 T4. 奇数单增序列思路分析 T5. 话题焦点人物思路分析 T1. 数组指定部分逆序重放 将一个数组中的前 k k k 项按逆序重新存放。例如&#xff0c;将数组 8 , 6 , 5 , 4 , 1 8,6,5,4,1 8,6,5,…

Java开发之JDBC

JDBC 介绍JDBC程序&#xff08;Statement&#xff09;相关细节URLResultSet 连接池程序&#xff08;PreparedStatement&#xff09; 本文主要记录一下学习JDBC的一些知识点 介绍JDBC 首先谈谈什么是JDBC。下面放几张图&#xff0c;大致就可以清楚JDBC了。程序&#xff08;Sta…

网络编程—— Http的Get请求

http: hyper text transport protocal:超文本传输协议。 http是一种基于客户端-服务器模式的协议(Client-Server)。它规定只能由客户端先发起请求给服务器&#xff0c; 服务器做出响应。 http数据传输以数据报文的形式进行&#xff0c; 客户端向服务器发起的请求叫做请求报文。…

HunyuanDiT

1、依赖关系和安装 首先克隆存储库&#xff1a; git clone https://github.com/tencent/HunyuanDiT cd HunyuanDiT unzip HunyuanDiT-main.zip 2、一个environment.yml用于设置 Conda 环境的文件一个environment.yml用于设置 Conda 环境的文件 conda create -n hunyuandit py…

centos7 redis开机启动

[rootlocalhost system]# vim /etc/systemd/system/redis.service 版本是5.0 /usr/local/redis 是redis安装目录 [Unit] DescriptionRedis.server # 指定服务所依赖的其他单元&#xff08;如网络服务&#xff09;。这确保在启动该服务之前&#xff0c;所需的其他单元已经启动…

C++语法|虚函数与多态详细讲解(七)|理解抽象类?(面试向)

系列汇总讲解&#xff0c;请移步&#xff1a; C语法&#xff5c;虚函数与多态详细讲解系列&#xff08;包含多重继承内容&#xff09; 主要是两个问题&#xff1a; 抽象类和普通类有什么区别&#xff1f;一般把什么类处理处理成抽象类 在这里&#xff0c;案例我们仍然沿用上篇…

【Linux玩物志】Linux环境开发基本工具使用(终章) ——git与gdb调试器

W...Y的主页 &#x1f60a; 代码仓库分享 &#x1f495; 前言&#xff1a;这是最后一篇Linux工具篇&#xff0c;今天这篇文章我们要来简单讲一件git与调试器gdb。 目录 使用 git 命令行 安装 git 在 Github 创建项目 注册账号 创建项目 ​编辑 下载项目到本地 在 Gite…

leetcode397周赛场

第一题&#xff1a;两个字符串的排列差 给你两个字符串 s 和 t&#xff0c;每个字符串中的字符都不重复&#xff0c;且 t 是 s 的一个排列。 排列差 定义为 s 和 t 中每个字符在两个字符串中位置的绝对差值之和。 返回 s 和 t 之间的 排列差 。 示例 1&#xff1a; 输入&am…

解决push时,报错error_ failed to push some refs to ‘https___gitee.com_...‘

remote: error: File: 90c5365492dea3b3c855b2375f1de8588ac1bda4 162.65 MB, exceeds 100.00 MB. 原因是上传的文件超过100.00 MB Gitee限制上传的每个文件的大小&#xff0c;不能超过100MB 高于100MB无法上传到Gitee远程仓库&#xff0c;把超过大小的文件添加到Git忽略提交规…

融合基因组序列识别scATAC-seq的细胞类型

利用scATAC-seq技术进行单细胞分析&#xff0c;可以在单细胞分辨率下深入了解基因调控和表观遗传异质性&#xff0c;但由于数据的高维性和极端稀疏性&#xff0c;scATAC-seq的细胞注释仍然具有挑战性。现有的细胞注释方法大多集中在细胞峰矩阵上&#xff0c;没有充分利用潜在的…

【Flutter】 webview请求权限问题

需求&#xff1a;webview可以通过录音后语音转文字。 使用插件&#xff1a; permission_handler: ^11.0.1 webview_flutter: ^4.7.0 代码如下&#xff1a; 1.添加权限 添加安卓的权限&#xff1a; android/app/src/main/AndroidManifest.xml <uses-permission android…

vue使用EventBus进行跨组件通信

Vue中的EventBus&#xff0c;又称为事件总线&#xff0c;是一种常用的通信模式&#xff0c;它允许在Vue应用程序的不同组件之间进行松耦合的通信&#xff0c;尤其是对于那些没有直接父子关系的组件间的通信非常有用。EventBus基于Vue的自定义事件系统实现&#xff0c;工作原理遵…

商品指数创年内新高,粘性通胀成为美联储噩梦

文章概述 虽然美国4月CPI增幅放缓让美联储今年降息的可能性大增&#xff0c;但与此同时&#xff0c;大宗商品价格却达到了一年来的最高水平&#xff0c;粘性通胀可能成为美联储的噩梦。数据显示&#xff0c;跟踪24种能源、金属和农业合约彭博大宗商品现货指数今年以来已经上涨…

【ARM 嵌入式 C 入门及渐进 6.3 -- C 函数嵌入多条汇编语句 】

请阅读【嵌入式开发学习必备专栏】 文章目录 C 函数嵌入多条汇编语句C 函数嵌入多条汇编语句 在C代码中嵌入多条ARMv8汇编语句,可以通过将这些汇编指令放置在一个asm块内来实现。使用GCC的内嵌汇编语法,你可以顺序地编写多个指令,并根据需要指定输入、输出和被破坏(clobbe…

【APM】在Kubernetes中,使用Helm安装Prometheus Server 0.73.2(开启远程写入功能)

1、Prometheus 简介 Prometheus 是一款开源的监控和警报系统,起源于 SoundCloud 并在2012年开始被广泛采用。它在2016年成为 Cloud Native Computing Foundation (CNCF) 的成员项目,与 Kubernetes 齐名,是云原生计算领域的重要组成部分。Prometheus 以其强大的灵活性、易用…

训练的过程中内存一直增加的问题

可能的原因一&#xff1a; 解决pytorch训练的过程中内存一直增加的问题_pytorch训练过程中,内存一直增长-CSDN博客 可能的原因二&#xff1a; DataLoader num_workers > 0 causes CPU memory from parent process to be replicated in all worker processes Issue #13246…