Kotlin 集合中的函数式 API 跟大部分支持 Lambda 语言的函数式 API 都类似。下面仅以 filter、map、flatMap 三个函数为例,演示使用集合的高阶函数。...listOf("java","kotlin","scala","groovy") .map { it.toUpperCase() } .forEach(:...Sequence 序列(Sequence)是 Kotlin 标准库提供的另一种容器类型。序列与集合有相同的函数 API,却采用不同的实现方式。...{ it>10 } .forEach (::println) 在 Kotlin 1.2.70 的 release note 上曾说明: 使用 Sequence 有助于避免不必要的临时分配开销...它有两个相关而又有区别的含意,可以表示为“延迟求值”和“最小化求值”。除可以得到性能的提升外,惰性计算的最重要的好处是它可以构造一个无限的数据类型。
本文将介绍如何使用 Kotlin 的高阶函数,如sumBy, reduce, fold, map,filter,forEach 等,来应对常见的集合数据处理场景。...点击源码可以看到,其实它做的事情和上面 Java 实现的getAccountsSum是一样的,只是增加的值是通过我们传入的 lambda 来计算,而不是写死的Account.value。...那 Kotlin 有没有能指定acc类型的高阶函数?有的,它叫fold。...得益于范型,我们可以通过这个办法来指定acc的类型。这样一来,fold可以完美替代sumBy的场景。而相比fold,sumBy更专用,表意更清晰,写起来也更简洁。...可以通过filter函数加map函数完成: val vipAccounts = accounts .filter { it.value >= 10000 } .map
对于迭代其行为像 forEach 但是也进一步返回可迭代实例。 对于序列它返回一个 包装序列,它在元素迭代时延迟应用给定的动作。...Map.filter() 或 Map.filterKeys()。...它们都支持 JVM (它们作为 java.util.Arrays 中的相应函数的别名)和 JS(在 Kotlin 标准库中提供实现)。...在 JVM 平台上,一些名称是相应 JDK 类的 类型别名,而在 JS 平台上,这些类在 Kotlin 标准库中实现。...external 修饰符 如果你需要以类型安全的方式在 Kotlin 中访问 JavaScript 实现的类, 你可以使用 external 修饰符写一个 Kotlin 声明。
用户把对操作的控制权交还给类库,从而允许类库进行各种各样的优化(例如乱序执行、惰性求值和并行等等)。总的来说,内部迭代使得外部迭代中不可能实现的优化成为可能。...(RED)); 在Collection上调用stream()会生成该集合元素的流,接下来filter()操作会产生只包含蓝色形状的流,最后,这些蓝色形状会被forEach操作设为红色。...; Stream不存储值 对Stream的操作会产生一个结果,但是Stream并不会改变数据源; 大多数Stream的操作(filter,map,sort等)都是以惰性的方式实现的。...三、惰性求值 vs 急性求值 filter()和map()这样的操作既可以被急性求值(以filter()为例,急性求值需要在方法返回前完成对所有元素的过滤),也可以被惰性求值(用Stream代表过滤结果...在sum()操作之后才会把filter()、map()和sum()放在对数据源一次遍历中。这样可以大大减少维持中间结果所带来的开销。 四、举个栗子?
= null //在主构造函数中不能有任何代码实现,如果有额外的代码需要在构造方法中执行,你需要放到init代码块中执行 init { name = "Zhang Tao...length 在 Kotlin 中创建单例不用像 Java 中那么复杂,只需要把 class 换成 object 就可以了。...filter:对每个元素进行过滤操作,如果 lambda 表达式中的条件成立则留下该元素,否则剔除,最终生成新的集合 map:遍历每个元素并执行给定表达式,最终形成新的集合 flatMap:遍历每个元素...官方提供的线程api 属性委托 有些常见的属性操作,我们可以通过委托方式,让它实现,例如:lazy 延迟属性: 值只在第一次访问的时候计算 类委托 可以通过类委托来减少 extend类委托的时,编译器回优使用自身重新函数...少了 wait()/notify()等函数 Unit Kotlin 中的 Unit 对应 Java 中的 void 在 Java 中通过 「类名.this」 获取目标类引用 在 Kotlin
最近在探索相同特性在不同语言中实现的对比的文章写作思路,如果大家觉得有收获,别忘了点个赞让我感受一下;如果觉得这思路有问题,欢迎评论留言提建议 ~~ Kotlin 的延迟求值 Kotlin 最初亮相的时候...这么看来 Swift 也可以通过传入函数来实现延迟求值。有了前面 Scala 的经验,我们就不免要想,函数参数延迟求值的写法上能否进一步简化呢?答案是能,通过 @autoclosure 来实现。...简单总结一下,Swift 通过 lazy 关键字来实现类属性的延迟求值,这一点写法上虽然与 Scala 很像,但只能修饰类或结构体的成员,而且是可读写的成员;Swift 同样可以通过传入函数的形式来支持函数参数的延迟求值...小结 总结一下: Kotlin 没有 lazy 关键字,通过属性代理实现只读属性的延迟求值,而 Scala 和 Swift 则通过 lazy 关键字来做到这一点 Kotlin 和 Scala 对于属性的延迟求值只支持只读属性...他们仨都支持通过传入函数的方式来实现函数参数的延迟求值。 Scala 和 Swift 对函数参数延迟求值在语法上有更友好的支持,前者通过传名参数,后者通过 @autoclosure。
在Kotlin中实现相同的功能,只需要使用函数参数即可。...为什么需要闭包 在了解闭包之前,需要先了解下变量的作用域,在kotlin中,变量的作用域只有两种,即全局变量和局部变量。 全局变量,函数内部和函数外部均可以直接访问。...后会返回true的那些元素 println("大于5的数 ${test.filter { it > 5 }}") // map函数对集合中的每一个元素应用给定的函数并把结果收集到一个新集合...}}") // filter与map链式操作 println("展示age大于10的name ${testList.filter { it.age > 10 }.map { it.name...//中间操作 //末端操作 testList.asSequence(). filter {..}.map {..}.toList() 因此,通过序列的这种方式,就避免了产生大量中间集合
介绍 同样在Kotlin中会有List、Map、Set,而与Java中数据结构大多相同,也略有区别。Kotlin中的集合分为可变集合与不可变集合。...创建可变与不可变的List 在Kotlin中都是通过标准库来创建集合类,例如: 创建可变List:通过mutableListOf(),返回MutableList对象 创建不可变List:通过listOf...中的遍历和Groovy一样,都可以使用foreach闭包来完成,也可以使用in关键字来实现 class TestKotlin { fun function() { var mutableList...2) for (value in mutableList) { print("value:$value") } } } 而过滤List中的部分数据也可以通过闭包来实现...,通过filter,我们过滤了小于1的元素。
} // 但是因为初始化是 lazy 的,所以只在第一次被用到的时候才会计算,于是不会输出 "Computed" 如果对于一个类的成员,我们在构造函数中没有办法知道它的初始值,那么只能将它初始化成了...UninitializedPropertyAccessException 注意 lateinit 修饰的只能是 var而不可以是 val,其类型不能是基本类型也不能是一个 nullable 可以个 .isInitialized 来判断一个延迟初始化的变量有没有被初始化...,这个在 Kotlin 中叫做 internal override 在 Kotlin 中是强制的,避免意外 override protected 在 Java 中仍然对同一个包内的其他类可见,在 Kotlin...] 操作,会调用 map.get(index) Java 的 String 没有实现 Iterable 接口,但是 Kotlin 中可以通过定义拓展函数的方法重载迭代运算符 operator fun CharSequence.iterator...(): CharIterator for (c in "abc") { ... } 解构式的定义,在本质上也是运算符的重载 argument.component1() map.forEach { (key
延迟执行:流的部分操作是惰性求值的,这意味着它们不会立即执行,而是在需要结果的时候才执行。这就像是您手中的指挥棒,只有在合适的时刻挥下,音乐家们才开始演奏。...在流中,大多数的中间操作(如filter、map、flatMap、sorted等)都是惰性求值的。...();在这个例子中,filter、map和sorted都是惰性求值操作,它们不会立即执行,而是等待最终操作。...在流API中,最终操作(如collect、forEach、findFirst、findAny、limit、count、min、max、reduce等)通常是非惰性求值的。...下面是一些典型的使用场景:数据过滤(Filtering):当你需要从大量数据中筛选出符合特定条件的元素时,使用流的filter方法可以轻松实现。
当然在kotlin中函数也是同样的作用了。...上图中数据的流程是,list进行遍历,当遍历到第二个元素,满足filter的条件,将第二个元素的值 2 送到map当中,map通过自己的算法得出5,将5放到forEach方法中输出,发现没有,它并没有在...当然了kotlin也可以实现一样的结果,通过asSequence函数,如下所示: ?...但是,上面的流水线操作一定要在最后调用forEach(流水线开关),如果不调用forEach的话,filter和map也是不会调用的,通常称作懒序列,当然一些聚合操作也可以充当开关。...但是kotlin显然可以不用调用asSequence函数,通过集合直接调用,那么如果是直接通过集合来调用,显然就相当于先调用filter函数,全部执行完返回一个列表,然后新的列表集合调用map,以此类推最后调用到
为了更好的认识Java与Kotlin这两门语言,我们在这里给出一些基本功能,同时使用Java与Kotlin来实现的代码实例。通过横向对比,从中我们可以看出它们的异同。...("Kotlin") 其实,Kotlin中的println函数是一个内联函数,它其实就是通过封装java.lang.System类的System.out.println来实现的。...length 在Kotlin中,我们只使用一个问号安全调用符号就省去了Java中烦人的if - null 判断。...中使用$和${}(花括号里面是表达式的时候)占位符来实现字符串的拼接,这个比在Java中每次使用加号来拼接要方便许多。...if (object is Car) { var car = object // Kotlin智能转换 } Kotlin的类型系统具备一定的类型推断能力,这样也省去了不少在Java中类型转换的样板式代码
Kotlin没有去重复造轮子(Scala则是自己实现了一套集合类框架),而是在Java 类库的基础上进行了改造和扩展,引入了不可变集合类,同时扩展了大量方便实用的功能,这些功能的API 都在 kotlin.collections...另外,在Kotlin中集合类不仅仅能持有普通对象,而且能够持有函数类型的变量。...而这个时候,我们可以在代码里选择调用哪个函数 val list = listOf(1, 2, 3, 4, 5, 6, 7) list.filter(funlist[0]) // [2, 4, 6] list.filter...K, V>.forEach(action: (Map.Entry) -> Unit): Unit 我们看到,在Iterable 和 Map中, forEach 函数都是一个内联 inline...5章中,我们已经讲过了filter函数,这里我们再举一个代码示例。
在 kotlin 中有多少种构造函数 ---- kotlin 将构造函数分为了两种: 主构造函数和次构造函数。...在某个类中,如果某些成员变量没办法在一开始就初始化,并且又不想使用可空类型(也就是带?的类型)。那么,可以使用 lateinit 或者 by lazy 来修饰它。..., 18, 88) arr.filter { //这里是通过条件 it % 2 == 0 } //takeWhile,带满足条件的过滤 //它的实现和filter不同地方在filter...首先伴生对象中的代码是在类加载时就会执行。init代码块中的方法会按顺序放在主构造函数中,主构造函数中原来的代码会在后面执行。 9. const 和 val 有什么区别?...如果这些函数中的任何一个在类体中显式定义或继承自其基类,则不会自动生成该函数。如果变量是 val 修饰,只会生成 get 方法。 11. 什么是 Range 操作符?
在Stream API中,许多操作(如map、filter、reduce)都依赖于函数式接口来处理数据。...5.1 延迟求值与惰性求值Lambda表达式具有惰性求值(Lazy Evaluation)特性,这意味着它的代码只有在需要时才会执行,而不是立即执行。这对于提高性能、避免不必要的计算非常有帮助。...例如,在Stream API中,map、filter等中间操作不会立即执行,而是通过终端操作(如collect、forEach)触发执行。...(n -> n * n) // 然后平方 .forEach(System.out::println); // 终端操作,触发惰性求值 }}在这段代码中...,filter和map是中间操作,不会立即执行。
Kotlin中如何退出forEach 在 Kotlin 中,forEach 是一个高阶函数,它在遍历集合时会对集合中的每一个元素执行给定的 lambda 表达式。...在 forEach 中你可以使用自定义的标签配合 return,以退出循环。...带标签的 return退出闭包操作 在高阶函数中,例如 forEach、map、filter 等闭包操作中,如果你需要提前退出,可以使用带标签的 return。...在 Kotlin Standard Library 中,如果想中断 forEach 或其他 lambda 表达式,直接 return 会导致外层函数返回,因此需要使用标签。...inline 和非局部返回,你能够在高阶函数中实现类似早期的 goto 的效果,但是更安全、更易懂。
这样的实现方式确实减少了运算量,找够两个就直接收工了。 但是这实在很糟糕,它显式使用了return同时还引入了可变量,不符合函数式的写法。 有什么东西像是一个foreach循环而又可以不引入可变量呢?...答案就是:因为Stream利用了惰性求值(lazy evaluation),或者也可以称之为延迟执行(deferred execution)。...} } . . . . . . } 这个方法定义在基类里,又是一个看似递归的实现。...因为在if (p(h())) cons(h(), t().filter(p))这行代码中我们又用到了小写的cons,它所接受的参数不会被立即求值。...这次没有使用cons,没有任何计算被延迟执行,我们通过不断地对h()求值,来把整个Stream中每一个能够生产数据的函数都调用一遍以此来拿到我们最终想要的数据。
这样的实现方式确实减少了运算量,找够两个就直接收工了。 但是这实在很糟糕,它显式使用了return同时还引入了可变量,不符合函数式的写法。 有什么东西像是一个foreach循环而又可以不引入可变量呢?...答案就是:因为Stream利用了惰性求值(lazy evaluation),或者也可以称之为延迟执行(deferred execution)。...=> empty } } . . . . . . } 这个方法定义在基类里,又是一个看似递归的实现。...因为在if (p(h())) cons(h(), t().filter(p))这行代码中我们又用到了小写的cons,它所接受的参数不会被立即求值。...这次没有使用cons,没有任何计算被延迟执行,我们通过不断地对h()求值,来把整个Stream中每一个能够生产数据的函数都调用一遍以此来拿到我们最终想要的数据。
在使用Kotlin的这段时间,被它的简洁,高效,快捷等等特点震撼,所以有必要写一篇文章来谈一谈Kotlin的特性,如若能取得推广Kotlin的效果则倍感欣慰。...,即表示这个变量或参数以及返回值可以为null,否则不允许为变量参数赋值为null或者返回null 对于一个可能是null的变量或者参数,在调用对象方法或者属性之前,需要加上?,否则编译无法通过。...读到这里,是不是想要尝试一下Kotlin呢,它简洁的语法,汇集诸多特性,高效率实现等等,已经在国外风生水起,国外的Pintereset, Square, Flipboard等公司已经开始应用到生产中。...,以及在Kotlin中无时无刻不在和Java相关的东西打交道,所以这点顾虑不是问题的。...当然更主要的是目前团队规模不大,成员一致认可Kotlin的优点。 关于团队转用Kotlin的方法,一般比较行得通的办法是自上而下的推行。
2)、像filter这样只描述Stream,最终不产生新集合的方法叫作惰性求值方法,而像count这样最终会从Stream产生值的方法叫作及早求值方法。 ...36 long count = lists.stream().filter(list -> { 37 System.out.println("filter是惰性求值方法...和map方法都返回Stream对象,因此都属于惰性求值,而collect方法属于及早求值。...2)、和类不同,接口没有成员变量,因此默认方法只能通过调用子类的方法来修改子类本身,避免了对子类的实现做出各种假设。 11、Java 8中的默认方法,理解: 答:1)、类胜于接口。...如果一个接口继承了另一个接口,且两个接口都定义了一个默认方法,那么子类中定义的方法胜出。 3)、如果上面两条规则不适用,子类要么需要实现该方法,要么将该方法声明为抽象方法。 。
领取专属 10元无门槛券
手把手带您无忧上云