作者:Antonio Leiva

时间:Feb 2, 2017

原文链接:https://antonioleiva.com/functional-operations-collections-kotlin/

对于我来说,我必须承认用Java代码处理列表是最令人沮丧的事之一。

在这方面,虽然Java 8利用数据流(Stream)已经有了一些提升,但是如我们早前看到的我们怎样利用高阶函数压缩代码那样,Kotlin语法极大地简化这个过程。

Kotlin中集合的功能操作

虽然我不向你展示所有已有的操作(有很多),但是我要向你展示其中一部分,你能够用它们做一些有趣的事。

如果你需要更完整的列表,你能够在我之前写的这篇文章中找到。

最有意思的是这些:

forEach

用forEach,你能够简单迭代集合每个元素:

 viewGroup.children.forEach { v -> v.visibility = VISIBLE }

记住,用it,这还可以转换为:

 viewGroup.children.forEach { it.visibility = VISIBLE }

在Android中,没有viewGroup.children,但是在前面的文章“怎样获得扩展属性”中已见过。

map

这个操作把列表中的每个对象映射的新的列表,之后进行一些转换。回到前面ViewGroup的例子:

 val childViews = (0..viewGroup.childCount - 1).map { viewGroup.getChildAt(it) }

在这种情况下,map操作映射一集合的整数范围(先前已经讨论过范围)到ViewGroup子视图对应的新视图集合中。

在后续文章,我们将说明在同一个代码块中怎样避免冗余的多次引用ViewGroup。

filter

如其名称所示,filter允许我们依据特定条件过滤集合的元素。

例如,我们要过滤的ViewGroup子视图依次为ViewGroup:

 val childViews = viewGroup.children.filter { it is ViewGroup }

对于这个特殊情况,我们实际可以用filterIsinstance:

 val childViews = viewGroup.children.filterIsInstance<ViewGroup>()

有几种过滤类型,如filterNotNull,它舍弃null项;或filterNot,保留指定条件之外的项。

first / last

与前一项有关,它们返回列表满足一定条件的第一个,或最后一个元素:

 val firstTextView = viewGroup.children.first { it is TextView }
val lastTextView = viewGroup.children.last { it is TextView }

如果它们没有找到任何满足条件的元素,这些函数将抛出异常。在这种情况下,可以用替代方法firstOrNull,它会返回null。

sort

在Java中,排序元素总有点头疼,且代码的可读性很差。但是,用Kotlin,我们可以以任意条件排序,这就容易多了。

尽管这个例子可能没有多大意义,但是我可以依据可视性来排序ViewGroup子视图。在视图类中,可视性域是一整数,所以可以非常清晰知道一个视图比另一个大或是小:

 val firstTextView = viewGroup.children.sortedBy { it.visibility }

操作组合

当然,所有这些操作能够按照我们的要求进行组合,用这种方法,我们可以用少量代码完成十分复杂的操作:

  (0..viewGroup.childCount - 1)
.map { viewGroup.getChildAt(it) }
.filterIsInstance()
.sortedBy { it.visibility }
.takeWhile { it.visibility < View.GONE }

例如,这里ViewGroup中的所有ViewGroup视图被恢复,依据可视性排序,标记出那些可视性低于GONE(即Visible和INVISIBLE)。

这不仅仅功能非常强大,而且比你用Java 6编写同样的功能更易于阅读。

结论

在Kotlin中,对于集合的操作使我们节省大量代码行,获得更好的表达性和可读性。

这帮助我们减少编写错误的代码。非常棒!

如果你要继续学习Kotlin,你能够获得免费指南,学习怎样建立你的第一个项目,或获取这本书,学习怎样从挠头到创建一个复杂的APP。

Kotlin中功能操作与集合(KAD 11)的更多相关文章

  1. Kotlin中三元运算符

    int a = 10;int b = 11;int c = a > b ? a : b; 到了 kotlin中 val a = 10val b = 11val c = if (a > b) ...

  2. Kotlin入门第二课:集合操作

    测试项目Github地址: KotlinForJava 前文传送: Kotlin入门第一课:从对比Java开始 初次尝试用Kotlin实现Android项目 1. 介绍 作为Kotlin入门的第二课, ...

  3. Kotlin中变量不同于Java: var 对val(KAD 02)

    原文标题:Variables in Kotlin, differences with Java. var vs val (KAD 02) 作者:Antonio Leiva 时间:Nov 28, 201 ...

  4. 【springboot】【redis】springboot结合redis,操作List集合实现时间轴功能

    springboot结合redis,操作List集合实现时间轴功能

  5. Kotlin中when表达式的使用:超强的switch(KAD 13)

    作者:Antonio Leiva 时间:Feb 23, 2017 原文链接:https://antonioleiva.com/when-expression-kotlin/ 在Java(特别是Java ...

  6. Lambda表达式在Kotlin中怎样工作的:setOnClickListener的转换(KAD 18)

    作者:Antonio Leiva 时间:Mar 28, 2017 原文链接:https://antonioleiva.com/lambdas-kotlin-android/ 虽然,我在其它文章讲过一点 ...

  7. Java 集合系列11之 Hashtable详细介绍(源码解析)和使用示例

    概要 前一章,我们学习了HashMap.这一章,我们对Hashtable进行学习.我们先对Hashtable有个整体认识,然后再学习它的源码,最后再通过实例来学会使用Hashtable.第1部分 Ha ...

  8. Java中的并发编程集合使用

    一.熟悉Java自带的并发编程集合 在java.util.concurrent包里有很多并发编程的常用工具类. package com.ietree.basicskill.mutilthread.co ...

  9. 《Java虚拟机原理图解》1.5、 class文件中的方法表集合--method方法在class文件中是怎样组织的

    0. 前言 了解JVM虚拟机原理是每一个Java程序员修炼的必经之路.但是由于JVM虚拟机中有很多的东西讲述的比较宽泛,在当前接触到的关于JVM虚拟机原理的教程或者博客中,绝大部分都是充斥的文字性的描 ...

随机推荐

  1. POJ-3187 Backward Digit Sums---枚举全排列

    题目链接: https://vjudge.net/problem/POJ-3187 题目大意: 输入n,sum,求1~n的数,如何排列之后,相邻两列相加,直到得出最后的结果等于sum,输出1~n的排列 ...

  2. 基于稀疏表示的图像超分辨率《Image Super-Resolution Via Sparse Representation》

    由于最近正在做图像超分辨重建方面的研究,有幸看到了杨建超老师和马毅老师等大牛于2010年发表的一篇关于图像超分辨率的经典论文<ImageSuper-Resolution Via Sparse R ...

  3. 怎么让Sublime Text不自动打开最近的文件/项目

    "hot_exit": false,"remember_open_files": false,

  4. JDBC-Hibernate-Mybatis

    JDBC sql语句和Java代码混在了一起 Hibernate 自动生成sql语句 Mybatis 将sql语句写在xml文件中,使用时动态生成

  5. Oracle 的jdbc方法

    package com.swift.jdbc_oracle; import java.sql.CallableStatement; import java.sql.Connection; import ...

  6. ES6初识- Class

    { //基本定义和生成实例 class Parent{ //构造函数 constructor(name='lisi'){ this.name=name; } //属性get,set get longN ...

  7. SEOer必读:50个网站推广方法

    1.论坛推广 这里所说的论坛推广绝对不是在论坛里一个一个版贴广告,也不是将网站地址加在签名里然后疯狂刷屏,那样既耗费精力而且效果也不见得好,论坛管理员只要点几下鼠标就能将你的帖子全部删除,顺便封掉你的 ...

  8. javascript遍历方法总结

    forEach 循环 JavaScript诞生已经有20多年了,我们一直使用的用来循环一个数组的方法是这样的: for (var index = 0; index < myArray.lengt ...

  9. pycharm快捷键一览

    编辑(Editing) Ctrl + Space 基本的代码完成(类.方法.属性)Ctrl + Alt + Space 快速导入任意类Ctrl + Shift + Enter 语句完成Ctrl + P ...

  10. git分布式版本控制系统常用的操作

    Git是一个版本控制系统,用来追踪计算机文件的变化的工具,也是一个供多人使用的协同工具.它是一个分布式的版本控制系统,本文将简单介绍如何使用.简单来说,就是你要和你的伙伴一起完成一项任务,但是你们要互 ...