学习Kotlin~函数式编程

这篇具有很好参考价值的文章主要介绍了学习Kotlin~函数式编程。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

函数式编程

  • 高阶函数:以函数为参数或返回函数
  • 函数式编程范式主要依赖于高阶函数返回的数据,这些高阶函数专用于处理各种集合
  • 这些高阶函数可方便的联合多个同类函数构建链式操作以创建复杂的计算行为

函数类别

  • 一个函数式应用通常由三大类构成:变换transform、过滤filter、合并combine
  • 每类函数都针对集合数据类型设计,目标是产生一个最终结果

变换transform

  • 变换函数会遍历集合内容
  • 首先用一个以值参形式传入的变换器函数,变换每一个元素
  • 然后返回包含已修改元素的集合给链上的其他变换器函数使用
  • 最常用的两个变换函数式map和flatMap
map
	val animals = listOf<String>("zebra", "giraffe", "elephant", "rat");
	//变换器函数作用于集合里的各个元素,返回结果是包含已修改元素的集合,作为链上下一个函数的输入
	val babies = animals.map { animal ->
	    "A baby $animal"
	}.map { baby ->
	    "$baby ,with the cutest little tail ever!"
	}
	println(animals)
	println(babies)
	
	
	val animals_animals = listOf<String>("zebra", "giraffe", "elephant", "rat");
	//map返回的集合中的元素个数和输入集合必须一样,不过,返回的新集合里面的元素可以是不同类型的
	val animaslLength = animals_animals.map { it.length }
	println(animaslLength)
flatMap
	/**
	 * flatMap函数操作一个集合的集合,将其中多个集合中的元素合并后返回一个包含所有元素的单一集合
	 */
	fun main() {
	    val result = listOf(
	        listOf(1, 2, 3),
	        listOf(4, 5, 6)
	    ).flatMap { it }
	
	    println(result)
	}

过滤filter

  • 过滤函数接受一个predicate函数,用它按给定条件检查接收者集合里的元素并给出true或false的判定
  • 如果predicate函数返回true,受检元素添加到过滤函数返回新集合里
  • 如果返回false,受检元素被移出新集合里
	/**
	 * 过滤函数接受一个predicate函数,用它按给定条件检查接受者集合里的元素并给出true或false的判定
	 * 如果predicate函数返回true,受检元素会添加到过滤函数返回的新集合里
	 * 如果predicate函数返回false,受检元素会移出到过滤函数返回的新集合里
	 */
	fun main() {
	    val result = listOf<String>("Jack", "Jimmy", "Rose", "Tom")
	        .filter { it.contains("J") }
	    println(result)
	}
	/**
	 * filter过滤函数接受一个predicate函数,在flatMap遍历它的输入集合
	 */
	fun main() {
	    val items = listOf(
	        listOf("red apple", "green apple", "blue apple"),
	        listOf("red fish", "blue fish"),
	        listOf("yellow banan", "teal banana")
	    );
	    val redItems = items.flatMap {
	        //在flatMap遍历它的输入集合中的所有元素时
	        //filter函数会让predicate函数按过滤条件,将符合条件的元素都放入它返回的新集合里
	        it.filter { it.contains("red") }
	    }
	    println(redItems)
	
	    println(2 until 10);//(2..9)
	
	    //找素数
	    val numbers = listOf<Int>(7, 4, 8, 4, 3, 22, 18, 11);
	    val peimes = numbers.filter { num ->
	        //先过滤出一个集合,集合中所有元素都不等于0,那么就是素数
	        (2 until num).map { num % it }
	            .none { it == 0 }
	    }
	    println(peimes)
	
	}

合并combine

  • 合并函数能将不同的集合合并成一个新集合
  • 不同于接受者是包含集合的集合的flatMap函数
zip
  • zip合并函数来合并两个集合,返回一个包含键值对的新集合
	val employees = listOf("Jack", "Jason", "Tommy");
	val shirtSize = listOf("large", "x-large", "medium")
	
	//zip合并函数来合并两个集合,返回一个包含键值对的新集合
	val employeeshirtSize = employees.zip(shirtSize).toMap();
	println(employeeshirtSize["Jack"])
fold
  • 这个合并函数接受一个初始累加器值,随后会根据匿名函数的结果更新
	//fold合并函数接受一个初始累加器值,随后会根据匿名函数的结果更新
	//accumulator参数是初始累加器值,后面参数是匿名函数
	val foldedValue = listOf(1, 2, 3, 4).fold(0) { accumulator, number ->
	    accumulator + (number * 3)
	}
	println("Final value: $foldedValue")

序列

  • Kotlin有个内置惰性集合类型叫序列Sequence;

  • 惰性集合,类似于惰性初始化,包含大量元素是,集合元素是按需产生的;

  • 在使用一个序列时,序列里的值可能有无限多,因为某个数据源可能产生无限多个元素;文章来源地址https://www.toymoban.com/news/detail-525034.html

generateSequence
	private fun Int.isPrime(): Boolean {
	    (2 until this).map {
	        if (this % it == 0) return false;
	    }
	    return true;
	}
	
	
	fun main() {
	
	    val list = (1..5000).toList().filter {
	        it.isPrime()
	    }.take(1000);
	    println(list.size)
	
	    /**
	     * 第一个参数,接受一个初始种子值作为序列的起步值
	     *
	     * 第二个参数,匿名函数是指定的迭代器函数,决定下一个要产生的值
	     */
	    val sequenceList = generateSequence(2) { value ->
	        value + 1
	    }.filter { it.isPrime() }.take(1000);
	    println(sequenceList.toList().size)
	
	}

到了这里,关于学习Kotlin~函数式编程的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 学习Kotlin~函数

    函数参数 不打算传入值参,可以预先给参数指定默认值 有名的函数值参,如果使用命名值参,可以不用管值参的顺序 参数的顺序相反了,也不会影响最终结果。 Unit函数 Kotlin中没有返回值的函数叫Unit函数。 Nothing类型 TODO函数的任务就是抛出异常,就是永远别指望它能运行成

    2024年02月11日
    浏览(41)
  • 【Kotlin】函数式编程 ① ( 函数式编程简介 | 高阶函数 | 函数类别 | Transform 变换函数 | 过滤函数 | 合并函数 | map 变换函数 | flatMap 变换函数 )

    编程范式 指的是 使用某种编程语言的 编程套路 或 编程习惯 ; 使用 Java 等高级语言进行的编程 , 编程范式 一般都是 面向对象编程 ; 与 面向对象编程 同等级的另外一种 编程范式 是 函数式编程 , 函数式编程 不依赖于 指定的语言 , 所有的编程语言都可以使用 函数式编程范式

    2024年01月18日
    浏览(47)
  • 【Kotlin】函数式编程 ③ ( 早集合与惰性集合 | 惰性集合-序列 | generateSequence 序列创建函数 | 序列代码示例 | take 扩展函数分析 )

    及早集合 与 惰性集合 : 及早集合 : Eager Collection , 指的是 List , Map , Set 等集合 , 这些集合创建后 , 需要 将元素提前存储到集合中 , 然后才能访问 ; 惰性集合 : Lazy Collection , 在 集合刚创建时不必将集合元素放进去 , 当使用这些元素时才生成 , 这些 集合元素按需产生 ; 在 惰性集

    2024年02月02日
    浏览(106)
  • Android开发:kotlin语言实现简易计算器

    输入两个数字,可选加减乘除操作符,并计算显示对应结果 随系统切换语言 可对结果进行四舍五入操作 界面布局:activity_main.xml文件代码 字符定义:string.xml文件代码 逻辑实现:MainActivity.kt 文件代码 方法一(偷懒): 复制文件到对应位置 方法二: 1. 绘制界面 2. 编写逻辑

    2023年04月08日
    浏览(48)
  • 【Kotlin】DSL 领域特定语言 ( apply 标准库函数分析 | 普通匿名函数 | 扩展匿名函数 | 泛型扩展匿名函数 )

    本章总结 : 读懂 apply 标准库函数 核心是其 block: T.() - Unit 参数 , 这是 泛型扩展匿名函数 ; 泛型扩展匿名函数 T.() - Unit 演变路径 : 普通匿名函数 : () - Unit , 这个函数 参数 和 返回值 都为空 ; 扩展匿名函数 : String.() - Unit , 这个函数 是 为 具体的 String 类型定义的扩展函数 ; 泛型

    2023年04月09日
    浏览(39)
  • VS Code环境下配置Kotlin语言开发环境

    目录 一、安装VS Code扩展 1.安装Kotlin Language 2. 安装、配置Code Runner 二、安装Kotlin-compiler 1.下载Kotlin-compiler 2.安装JDK 3.配置环境变量 三、测试代码 安装成功后进入Code Runner扩展设置,下滑勾选Code-runner:Run In Terminal  打开Kotlin官网  Kotlin https://kotlinlang.org/  Get started打开Kotlin的官

    2024年02月09日
    浏览(54)
  • kotlin学习(二)泛型、函数、lambda、扩展、运算符重载

    Kotlin 中的类可以有类型参数,与 Java 类似: 创建这样类的实例只需要提供类型参数即可: 如果类型参数可以推断出来,例如从构造函数的参数或者从其他途径,就可以省略类型参数: String作为Object的子类,就可以直接将子类对象赋值给父类,这个操作即达到了 型变 。 但是

    2024年02月09日
    浏览(41)
  • Android 安卓开发语言kotlin与Java该如何选择

            如今在Android开发中,应用层开发语言主要是Java和Kotlin,Kotlin是后来加入的,主导的语言还是Java。kotlin的加入仿佛让会kotlin语言的开发者更屌一些,其实不然。         有人说kotlin的引入是解决开发者复杂的逻辑,并且对空指针控制的比较友好,但是我们在开

    2024年02月11日
    浏览(66)
  • Android开发知识学习——Kotlin进阶

    申明前缀有construct修饰 如果有一个主构造函数,每个次构造函数需要委托给主构造函数,可以直接委托或者通过别的构造函数 主构造函数:是类头的一部分,跟在类名后面(可带参数),没有任何注解和可见性修饰符。如: 主构造函数中没有任何代码,初始化代码放在关键

    2024年02月06日
    浏览(64)
  • 【第四阶段】kotlin语言的定义类和field关键字学习

    1.普通成员变量背后隐士代码 为什么在kotlin中是private 可以直接调用,隐式代码如下 val只有get方法 不能set 2.field

    2024年02月07日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包