Kotlin Lambda表达式实践使用介绍

目录
  • 集合的创建和遍历方式
  • 集合的函数式API

集合的创建和遍历方式

  • 集合只要包含List和Set在宽泛一些就包括Map这种键值对类型的数据结构
  • List,Set和Map在java当中都是接口,其中List的主要实现类是ArrayList和LinkedList,Set的主要用的实现类是HashSet,Map主要用的实现类是HashMap
  • 现在我们要创建一个水果集合来放水果,在Kotlin当中可以这样写
val list = ArrayList<String>()
list.add("苹果")
list.add("香蕉")
list.add("橘子")

这种初始化集合的方式比较繁琐,在Kotlin当中给我们提供了一个listOf方法可以简化集合的初始化

val list = listOf<String>("苹果", "香蕉", "橘子")

使用Kotlin当中的for-in方法对集合进行遍历

fun main() {
    val list = listOf<String>("苹果", "香蕉", "橘子")
    for (fruit in list) {
        println(fruit)
    }
}

需要注意的是使用listOf方法初始化的集合是一种不可变的集合,意思就是使用listOf初始化的集合只能用来读取不能用来添加,修改或者删除

那么我们要是想要快速初始化一个集合,又想要可变可以使用mutableListOf方法进行初始化

fun main() {
    val list = mutableListOf<String>("苹果", "香蕉", "橘子")
    list.add("哈密瓜")
    for (fruit in list) {
        println(fruit)
    }
}

Set集合地用户几乎和List一样,只是将创建集合地方式换成了setOf和mutableSetOf

val set = setOf<String>("香蕉", "橘子", "苹果")

set集合存放的元素是不可重复的

Map集合的用法在Kotlin当中也比较多,和java比较类似的是下面这一种

 val map = HashMap<String, Int>()
 map.put("香蕉", 1)
 map.put("西瓜", 2)

但是在Kotlin当中还有一种类似于数组下标的写法

val map = HashMap<String, Int>()
map["香蕉"] = 1
map["西瓜"] = 2

而在map中读取一条写法

map.get("香蕉")
//或者还可以是这样(推荐)
map["香蕉"]

当然上面这些都不是最简单的写法,在Kotlin当中给Map也提供了mapOf和mutableMapOf两个函数进行快速的初始化

fun main() {
    val map = mapOf<String, Int>("香蕉" to 1, "西瓜" to 2)
    for ((fruit, number) in map) {
        println("fruit is " + fruit + "number is " + number)
    }
}

集合的函数式API

在一个水果集合当中,找到单词最长那个水果

写法一:

 val list = listOf<String>("Apple", "Banana", "Orange", "Pear")
 var maxLengthFruit = ""
 for (fruit in list) {
     if (fruit.length > maxLengthFruit.length) {
         maxLengthFruit = fruit
     }
 }
 println("max length fruit is " + maxLengthFruit)

写法二:(使用函数式API写法)

    val list = listOf<String>("Apple", "Banana", "Orange", "Pear")
    val maxLengthFruit = list.maxBy { it.length }
    println("max length fruit is " + maxLengthFruit)
  • 上面的代码不易理解,下面一步步分析Lambda表达式的写法
  • Lambda定义:就是一小段可以作为参数传递的代码
  • Lambda表达式的语法结构体

{参数名1: 参数类型, 参数名2: 参数类型 -> 函数体}

  • 回到刚才找出最长单词的水果的需求,其中maxBy就是一个普通的函数而已,只不过就是接收了一个Lambda类型的参数,并且在遍历的时候将每次遍历的值传递给Lambda表达式,maxBy函数就是根据我们传入的条件来遍历集合,从而找到该条件下的最大值
  • 理解原理之后这个代码就可以这样写了
    val list = listOf<String>("Apple", "Banana", "Orange", "Pear")
    //定义一个lambda表达式
    val lambda = {fruit: String -> fruit.length}
    //然后将这个lambda表达式作为参数传递给maxBy函数,maxBy函数的作用就是遍历集合,根据参数条件来找到最大值
    val maxLengthFruit = list.maxBy(lambda)
  • 但是上述写法比较啰嗦麻烦,可以在此基础上进行简化操作
  • 首先不需要专门定义一个Lambda变量,而是可以直接将Lambda表达式传入maxBy函数中
val maxLengthFruit = list.maxBy({<!--{cke_protected}{C}%3C!%2D%2D%20%2D%2D%3E-->fruit: String -> fruit.length})
  • 然后在Kotlin当中规定当Lambda表达式是函数最后一个参数的时候,可以将Lambda表达式一道函数括号外面
val maxLengthFruit = list.maxBy(){<!--{cke_protected}{C}%3C!%2D%2D%20%2D%2D%3E-->fruit: String -> fruit.length}
  • 如果当lambda参数是函数唯一一个参数的时候,函数的括号可以省略
val maxLengthFruit = list.maxBy{<!--{cke_protected}{C}%3C!%2D%2D%20%2D%2D%3E-->fruit: String -> fruit.length}
  • 然后在Kotlin当中拥有优秀的推到机制,Lambda表达式中的参数列表在大多数的情况下没必要声明参数的类型,因此可以进一步简化成为
val maxLengthFruit = list.maxBy{<!--{cke_protected}{C}%3C!%2D%2D%20%2D%2D%3E-->fruit -> fruit.length}
  • 最后在Lambda中当参数列表只有一个参数的时候,也不必要声明参数名,而是直接使用it关键字代替即可,那么代码就变成了
val maxLenght = list.maxBy{<!--{cke_protected}{C}%3C!%2D%2D%20%2D%2D%3E-->it.length}
  • 集合当中的map函数是比较常用的一种函数式API,它将用于集合中每个元素都映射成为一个另外的值,映射的规则在Lambda表达式中进行指定
  • 将单词都转换成为大写字母
    val list = listOf<String>("Apple", "Banana")
    val newList = list.map { it.toUpperCase() }
    for (fruit in newList) {
        println(fruit)
    }
  • map函数的功能十分的强大,可以按照我们的需求对集合中的元素进行任意的映射转换
  • filter函数:是用来过滤集合当中数据的,可以单独使用,也可以和map函数配合在一起进行使用
  • 比如我们想保留5个字母以内的水果,并且将字母全部转换成为大写字母
val list = listOf<String>("Apple", "Banana", "Orange", "Pear", "Grape")
val newList = list.filter { it.length <= 5 }
    .map { it.toUpperCase() }
for (fruit in newList) {
    println(fruit)
}
  • any函数和all函数
  • any函数用于判断集合中是否至少存在一个元素满足指定条件,all函数用于判断集合中是否所有元素都满足指定的条件
val list = listOf<String>("Apple", "Banana", "Orange", "Pear", "Grape")
val anyResult = list.any {it.length <= 5}
val allResult = list.all { it.length <= 5 }
println("anyResult is" + anyResult + ", allResult is" + allResult)

到此这篇关于Kotlin Lambda表达式实践使用介绍的文章就介绍到这了,更多相关Kotlin Lambda内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Java8如何使用Lambda表达式简化代码详解

    系统环境: Java JDK 版本:1.8 参考地址: Java 8 Lambda 表达式 Jdk 8 新特性 04 方法引用与构造器引用 Java 8 新特性:Lambda 表达式之方法引用 一.Lambda 表达式简介 1.什么是 Lambda 表达式 Lambda 表达式是在 JDK 8 中引入的一个新特性,可用于取代大部分的匿名内部类.使用 Lambda 表达式可以完成用少量的代码实现复杂的功能,极大的简化代码代码量和代码结构.同时,JDK 中也增加了大量的内置函数式接口供我们使用,使得

  • Java使用lambda表达式简化代码的示例详解

    目录 目的 推理一下 实现接口,使用方法 内部类实现接口,使用方法 局部内部类实现接口,使用方法 匿名内部类实现接口,使用方法 使用lamda表达式的,实现方法 可带参数 只有一个参数 有返回值 只有一条语句 究极省略,不能再省了 lamda总结 代码,自然写的越简洁越好啦,写的人舒服,看的人也舒服,一切为了高效. 要把有限的时间花到其它有意思的事情上去. 目的 学习简化代码的思路,使用jdk8新特性lamada表达式. 推理一下 某接口,只有一个方法. 比如这个: package java.l

  • Java分析Lambda表达式Stream流合并分组内对象数据合并

    目录 前言 需求 代码实现 依赖引入 设计实体类 测试代码 前言 之前写过<Lambda使用——JDK8新特性>,现在有一个分组合并的需求正好拿来小试牛刀. 需求 数据出自许多接口数据,需要将几个接口数据根据省份id进行分组合并.举例说明: A接口返回List里面有值的的字段为:provinceId.field1.field2.field3 B接口返回List里面有值的的字段为:provinceId.field4.field5.field6 C接口返回List里面有值的的字段为:provinc

  • 简单聊聊工作中常用的Java Lambda表达式

    目录 前言 1. list转map 2. filter()过滤 3. foreach遍历 4. groupingBy分组 5. sorted+Comparator 排序 6.distinct去重 7. findFirst 返回第一个 8. anyMatch是否至少匹配一个元素 9. allMatch 匹配所有元素 10. map转换 11. Reduce 12. peek 打印个日志 13. Max,Min最大最小 14. count统计 15. 常用函数式接口 前言 日常开发中,我们很多时候需

  • Java中Lambda表达式的使用详细教程

    目录 简介 格式 实例 lambda作为参数 遍历集合 创建线程 排序 简介 说明 本文用示例展示Lambda表达式的用法.同时也会介绍Lambda的相关知识. Lambda表达式介绍 Lambda表达式的本质只是一个"语法糖",由编译器推断并帮你转换包装为常规的代码,因此你可以使用更少的代码来实现同样的功能. Lambda表达式是Java SE 8中一个重要的新特性. Lambda与匿名内部类 Lamda表达式指的是应用在SAM(SingleAbstractMethod,含有一个抽象

  • 必须掌握的十个Lambda表达式简化代码提高生产力

    目录 前言 1. 使用Lambda表达式进行集合遍历 2. 使用Lambda表达式进行排序 3. 使用Lambda表达式进行过滤 4. 使用Lambda表达式进行映射 5. 使用Lambda表达式进行归约 6. 使用Lambda表达式进行分组 7. 使用Lambda表达式进行函数式接口的实现 8. 使用Lambda表达式进行线程的创建 9. 使用Lambda表达式进行Optional的操作 10. 使用Lambda表达式进行Stream的流水线操作 结尾 前言   Lambda表达式是一种在现代

  • Kotlin方法与Lambda表达式实践使用介绍

    目录 前言 一.Kotlin的方法 1.方法声明 2.方法参数 3.方法作用域 二.Lambda表达式 1.Lambda表达式的特点 2.Lambda实践 总结 前言 经过前面对 Kotlin 的介绍,相信大家已经能对 Kotlin 有了一个基本的认识. 从这节开始,我就为大家讲解 Kotlin的方法以及Lambda表达式等高级操作. 一.Kotlin的方法 1.方法声明 fun functionLearn(days: Int): Boolean { return days > 100 } 成员

  • Java Lambda表达式超详细介绍

    目录 一.背景 1.Lambda表达式的语法 2.函数式接口 二.Lambda表达式的基本使用 三.语法精简 四.变量捕获 五.Lambda在集合当中的使用 1.Collection接口 六.List接口 1.sort()方法的演示 七.Map接口 一.背景 Lambda表达式是Java SE 8中一个重要的新特性.lambda表达式允许你通过表达式来代替功能接口. lambda表达式就和方法一样,它提供了一个正常的参数列表和一个使用这些参数的主体(body,可以是一个表达式或一个代码块). L

  • Kotlin中Lambda表达式与高阶函数使用分析讲解

    目录 Lambda表达式 高阶函数 小结 编程语言的发展,通过需求,不断的变化出新的特性,而这些特性就会使得编程变得更加的简洁. Lambda表达式 Lambda表达式的出现,一定程度上使得函数和变量慢慢的融为一体,这样做的好处大大的方便了回调函数的使用. 在很多的情况下,其实我们的函数就只有简单的几行代码,用fun就感觉有点重了,而且有的时候这么大的函数结构用起来,并不是非常的方便. Lambda表达式,其表达式为: {变量定义 -> 代码块} 其中: lambda 函数是一个可以接收任意多个

  • Java8学习教程之lambda表达式语法介绍

    前言 相信大家都知道,在Java8 中引入了 lambda 表达式,从行为参数化的角度,在使用时,将行为作为参数,去除包围在外层的不必要的类声明,使代码更加简洁. lambda 表达式的语法 lambda 表达式由参数,->,以及函数体三部分组成.其实函数体可以是表达式,也可以是语句.语句应该包含在{} 里,而表达式不能. lambda 表达式举例 (List<String> list) -> list.isEmpty() // 布尔类型表达式 () -> new Apple

  • 详解Kotlin 高阶函数 与 Lambda 表达式

    详解Kotlin 高阶函数 与 Lambda 表达式 高阶函数(higher-order function)是一种特殊的函数, 它接受函数作为参数, 或者返回一个函数. 这种函数的一个很好的例子就是 lock() 函数, 它的参数是一个锁对象(lock object), 以及另一个函数, 它首先获取锁, 运行对象函数, 然后再释放锁: fun <T> lock(lock: Lock, body: () -> T): T { lock.lock() try { return body()

  • Java8深入学习系列(一)lambda表达式介绍

    前言 最近在学习java8,所以接下来会给大家介绍一系列的Java8学习内容,那么让我们先从lambda表达式开始. 众所周知从java8出现以来lambda是最重要的特性之一,它可以让我们用简洁流畅的代码完成一个功能. 很长一段时间java被吐槽是冗余和缺乏函数式编程能力的语言,随着函数式编程的流行java8种也引入了 这种编程风格.在此之前我们都在写匿名内部类干这些事,但有时候这不是好的做法,本文中将介绍和使用lambda, 带你体验函数式编程的魔力. 什么是lambda? lambda表达

  • C# 本地函数与 Lambda 表达式详细介绍

    目录 1.C# 本地函数与 Lambda 表达式 2.Lambda 表达式 3.本地函数 4.那么,局部函数的目的是什么? 1.C# 本地函数与 Lambda 表达式 C# 局部函数通常被视为 lambda 表达式的进一步增强.虽然功能是相关的,但也存在重大差异. Local Functions 是嵌套函数]功能的 C# 实现.一种语言在支持 lambdas 之后获得对嵌套函数的支持几个版本是有点不寻常的.通常情况相反. Lambda 或一般的一流函数需要实现未在堆栈上分配且生命周期与需要它们的

  • Java中Lambda表达式用法介绍

    Lambda lambda是一个匿名函数,我们可以把lambda表达式理解为是一段可以传递的代码. lambda简明的地将代码或方法作为参数传递进去执行. "函数式编程"其核心是把函数作为值. 函数式接口 :只有一个 抽象方法的接口 称之为 函数式接口.函数式接口可以使用@FunctionalInterface进行注解. lambda表达式拆分为两部分 左侧:lambda 表达式的参数列表 右侧:lambda 表达式中所需要执行的功能,即lambda体 语法格式一:无参数,无返回值 @

  • C++lambda表达式使用介绍

    目录 前言 lambda表达式格式 一些语法 走进底层 前言 C++98中的一个例子. #include <iostream> #include <vector> #include <string> #include <algorithm> using namespace std; struct Goods { string _name; float _price; int _evaluate; Goods(const char* str, double p

  • Java中Lambda表达式之Lambda语法与作用域解析

    接上一篇:初探Lambda表达式/Java多核编程[2]并行与组合行为 本节是第二章开篇,前一章已经浅显地将所有新概念点到,书中剩下的部分将对这些概念做一个基础知识的补充与深入探讨实践. 本章将介绍Lambda表达式基础知识. 前言 把上一张书中的结语放到这里作为本章学习内容的开头,以此来概括Lambda表达式的优点: 提升性能.自动的并行化 更棒的API(comparing(...)细粒度的方法将成为标准) 编码风格得到改进.代码简化 反观前面几篇文章中的代码实践,以上三个优点全部得到了验证.

随机推荐