Kotlin常用的高阶函数(Filter、TakeWhile、Let、Apply、With......)

简介: 一、Filterpackage net.println.kotlin.chapter5.builtins/** * @author:wangdong * @description:Kotlin常见的高阶函数 */fun main(args: Array) { //求(0.

一、Filter

package net.println.kotlin.chapter5.builtins

/**
 * @author:wangdong
 * @description:Kotlin常见的高阶函数
 */

fun main(args: Array<String>) {

    //求(0..6)的阶乘
    (0..6).map(::factorial).forEach(::println)
    //阶乘过滤,只要阶乘是奇数的
    //public inline fun <T> Iterable<T>.filter(predicate: (T) -> Boolean): List<T> {
    //    return filterTo(ArrayList<T>(), predicate)
    //}
    println((0..6).map(::factorial).filter { it % 2 == 1 })  //[1, 1]
    //要处于奇数位上的阶乘
    println((0..6).map(::factorial).filterIndexed{ index, i ->  index % 2 == 1 })   //[1, 6, 120]
}

/**reduce求阶乘*/
//一个正整数的阶乘(英语:factorial)是所有小于及等于该数的正整数的积,并且有0的阶乘为1。 自然数n的阶乘写作n!。
//例如3的阶乘:1*2*3 = 6
fun factorial(n: Int): Int{
    if (n == 0)return 1
    //如果n >0,本次的acc*下一次的acc
    return (1..n).reduce{acc,i -> acc * i}
}

二、TakeWhile

package net.println.kotlin.chapter5.builtins

/**
 * @author:wangdong
 * @description:Kotlin常见的高阶函数
 */

fun main(args: Array<String>) {

    //求(0..6)的阶乘
    (0..6).map(::factorial).forEach(::println)
    //1
    //1
    //2
    //6
    //24
    //120
    //720

    //现在一个程序是,要按照顺序取数,遇到不符合要求的,程序就停止,例如遇到第一个偶数就停止
    println((0..6).map(::factorial).takeWhile { it % 2 == 1 })  //[1, 1]
}

/**reduce求阶乘*/
//一个正整数的阶乘(英语:factorial)是所有小于及等于该数的正整数的积,并且有0的阶乘为1。 自然数n的阶乘写作n!。
//例如3的阶乘:1*2*3 = 6
fun factorial(n: Int): Int{
    if (n == 0)return 1
    //如果n >0,本次的acc*下一次的acc
    return (1..n).reduce{acc,i -> acc * i}
}

三、Let的使用

package net.println.kotlin.chapter5.builtins


/**
 * @author:wangdong
 * @description:Kotlin常见的高阶函数
 */

fun main(args: Array<String>) {

    //let的使用
    findPerson() ?.let { persion ->
        persion.work()
    }
    //王栋 is working!!!
}

/**定义一个Person类*/
data class Person(var name:String, var age: Int){
    fun work(){
        println("$name is working!!!")
    }
}

fun findPerson(): Person ?{
    return Person("王栋",23)
}

四、Apply

package net.println.kotlin.chapter5.builtins
/**
 * @author:wangdong
 * @description:Kotlin常见的高阶函数
 */

fun main(args: Array<String>) {

    /**
     * Calls the specified function [block] with `this` value as its receiver and returns `this` value.
     */
    /*@kotlin.internal.InlineOnly
    public inline fun <T> T.apply(block: T.() -> Unit): T {
        contract {
            callsInPlace(block, InvocationKind.EXACTLY_ONCE)
        }
        block()
        return this
    }*/
    //apply的使用,可以直接调用work()方法,可以使用Persion中的成员变量
    findPerson() ?.apply {
        work()
        print(age)
    }

}

/**定义一个Person类*/
data class Person(var name:String, var age: Int){
    fun work(){
        println("$name is working!!!")
    }
}

fun findPerson(): Person ?{
    return Person("王栋",23)
}

五、With和Apply的区别
With用来传参、Apply用来调用

/**
 * Calls the specified function [block] with the given [receiver] as its receiver and returns its result.
 */
@kotlin.internal.InlineOnly
public inline fun <T, R> with(receiver: T, block: T.() -> R): R {
    contract {
        callsInPlace(block, InvocationKind.EXACTLY_ONCE)
    }
    return receiver.block()
}

/**
 * Calls the specified function [block] with `this` value as its receiver and returns `this` value.
 */
@kotlin.internal.InlineOnly
public inline fun <T> T.apply(block: T.() -> Unit): T {
    contract {
        callsInPlace(block, InvocationKind.EXACTLY_ONCE)
    }
    block()
    return this
}

六、两种方式读文件内容

package net.println.kotlin.chapter5.builtins

import java.io.BufferedReader
import java.io.FileReader


/**
 * @author:wangdong
 * @description:Kotlin常见的高阶函数
 */

fun main(args: Array<String>) {

    //1.推荐的输出方式
    val br = BufferedReader(FileReader("hello.txt")).readText()
    println(br)
    /*2.同样可以输出
    with(br){
        var line: String?
        while (true){
            line = readLine() ?: break
            println(line)
        }
        close()
    }*/

    //hello 王栋
}

七、Use
看看Use的源码

/**
 * Executes the given [block] function on this resource and then closes it down correctly whether an exception
 * is thrown or not.
 *
 * @param block a function to process this [Closeable] resource.
 * @return the result of [block] function invoked on this resource.
 */
@InlineOnly
@RequireKotlin("1.2", versionKind = RequireKotlinVersionKind.COMPILER_VERSION, message = "Requires newer compiler version to be inlined correctly.")
public inline fun <T : Closeable?, R> T.use(block: (T) -> R): R {
    var exception: Throwable? = null
    try {
        return block(this)
    } catch (e: Throwable) {
        exception = e
        throw e
    } finally {
        when {
            apiVersionIsAtLeast(1, 1, 0) -> this.closeFinally(exception)
            this == null -> {}
            exception == null -> close()
            else ->
                try {
                    close()
                } catch (closeException: Throwable) {
                    // cause.addSuppressed(closeException) // ignored here
                }
        }
    }
}

八、Use的小例子

package net.println.kotlin.chapter5.builtins

import java.io.BufferedReader
import java.io.FileReader


/**
 * @author:wangdong
 * @description:Kotlin常见的高阶函数
 */

fun main(args: Array<String>) {

    //1.推荐的输出方式
    val br = BufferedReader(FileReader("hello.txt")).use {
        var line: String?
        while (true) {
            line = it.readLine() ?: break
            println(line)
        }
    }
    //hello 王栋
}

好了,结束了!

目录
相关文章
|
7天前
|
Kotlin
Kotlin教程笔记(21) -高阶函数与函数引用
Kotlin教程笔记(21) -高阶函数与函数引用
22 2
Kotlin教程笔记(21) -高阶函数与函数引用
|
4天前
|
Kotlin
Kotlin教程笔记(21) -高阶函数与函数引用
Kotlin教程笔记(21) -高阶函数与函数引用
10 1
Kotlin教程笔记(21) -高阶函数与函数引用
|
2天前
|
开发者 Kotlin 索引
Kotlin教程笔记(22) -常见高阶函数
本系列教程详细讲解了 Kotlin 语法,适合希望深入了解 Kotlin 的开发者。对于需要快速上手 Kotlin 的读者,建议查阅“简洁”系列教程。本文档重点介绍了常见的高阶函数,包括 `forEach`、`map`、`flatMap`、`filter`、`takeWhile`、`reduce` 和 `fold`,并提供了详细的代码示例。
15 5
|
23天前
|
Kotlin
Kotlin教程笔记(21) -高阶函数与函数引用
Kotlin教程笔记(21) -高阶函数与函数引用
31 5
Kotlin教程笔记(21) -高阶函数与函数引用
|
24天前
|
Kotlin
Kotlin教程笔记(21) -高阶函数与函数引用
Kotlin教程笔记(21) -高阶函数与函数引用
23 2
Kotlin教程笔记(21) -高阶函数与函数引用
|
3天前
|
Kotlin
Kotlin教程笔记(21) -高阶函数与函数引用
本系列教程详细讲解Kotlin语法,适合深入学习。若需快速入门,请查阅“简洁”系列教程。本文重点介绍高阶函数与函数引用,包括函数类型、函数引用、成员方法引用及函数类型实例调用等内容。
13 1
|
4天前
|
Kotlin 索引
Kotlin教程笔记(22) -常见高阶函数
Kotlin教程笔记(22) -常见高阶函数
13 1
|
7天前
|
Kotlin 索引
Kotlin教程笔记(22) -常见高阶函数
Kotlin教程笔记(22) -常见高阶函数
22 4
|
23天前
|
Kotlin 索引
Kotlin教程笔记(22) -常见高阶函数
Kotlin教程笔记(22) -常见高阶函数
55 7
|
19天前
|
JSON 调度 数据库
Android面试之5个Kotlin深度面试题:协程、密封类和高阶函数
本文首发于公众号“AntDream”,欢迎微信搜索“AntDream”或扫描文章底部二维码关注,和我一起每天进步一点点。文章详细解析了Kotlin中的协程、扩展函数、高阶函数、密封类及`inline`和`reified`关键字在Android开发中的应用,帮助读者更好地理解和使用这些特性。
15 1