Kotlin中功能操作与集合(KAD 11)
时间: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)的更多相关文章
- Kotlin中三元运算符
		int a = 10;int b = 11;int c = a > b ? a : b; 到了 kotlin中 val a = 10val b = 11val c = if (a > b) ... 
- Kotlin入门第二课:集合操作
		测试项目Github地址: KotlinForJava 前文传送: Kotlin入门第一课:从对比Java开始 初次尝试用Kotlin实现Android项目 1. 介绍 作为Kotlin入门的第二课, ... 
- Kotlin中变量不同于Java: var 对val(KAD 02)
		原文标题:Variables in Kotlin, differences with Java. var vs val (KAD 02) 作者:Antonio Leiva 时间:Nov 28, 201 ... 
- 【springboot】【redis】springboot结合redis,操作List集合实现时间轴功能
		springboot结合redis,操作List集合实现时间轴功能 
- Kotlin中when表达式的使用:超强的switch(KAD 13)
		作者:Antonio Leiva 时间:Feb 23, 2017 原文链接:https://antonioleiva.com/when-expression-kotlin/ 在Java(特别是Java ... 
- Lambda表达式在Kotlin中怎样工作的:setOnClickListener的转换(KAD 18)
		作者:Antonio Leiva 时间:Mar 28, 2017 原文链接:https://antonioleiva.com/lambdas-kotlin-android/ 虽然,我在其它文章讲过一点 ... 
- Java 集合系列11之 Hashtable详细介绍(源码解析)和使用示例
		概要 前一章,我们学习了HashMap.这一章,我们对Hashtable进行学习.我们先对Hashtable有个整体认识,然后再学习它的源码,最后再通过实例来学会使用Hashtable.第1部分 Ha ... 
- Java中的并发编程集合使用
		一.熟悉Java自带的并发编程集合 在java.util.concurrent包里有很多并发编程的常用工具类. package com.ietree.basicskill.mutilthread.co ... 
- 《Java虚拟机原理图解》1.5、 class文件中的方法表集合--method方法在class文件中是怎样组织的
		0. 前言 了解JVM虚拟机原理是每一个Java程序员修炼的必经之路.但是由于JVM虚拟机中有很多的东西讲述的比较宽泛,在当前接触到的关于JVM虚拟机原理的教程或者博客中,绝大部分都是充斥的文字性的描 ... 
随机推荐
- UESTC 31 饭卡 card
			dp,答案容易想到是 凑出价格总和≤m-5 + 没被使用的最大价格. dp[i = 前i种价格][j = 价格总和] = 最大没使用的价格下标idx_m. dp[i-1][j]存在的话,则只要更新id ... 
- 反射java
			所谓反射(Refection),其实就是程序自己能够检查自身信息,就像程序会通过镜子反光来看自己本身一样.反射使得 Java语言具有了“动态性”,即程序首先会检查某个类中的方法.属性等信息,然后再动态 ... 
- linux 内存地址空间管理 mm_struct
			http://blog.csdn.net/yusiguyuan/article/details/39520933 Linux对于内存的管理涉及到非常多的方面,这篇文章首先从对进程虚拟地址空间的管理说起 ... 
- HDU(1016),打素数环
			题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1016 哈哈,状态来了就是不一样,很快就A了. 注意的位置是,最后一个点,要与第一个点比较. #incl ... 
- 2017.10.9 JVM入门学习
			1.什么是JVM JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现 ... 
- jQuery 遍历函数包括了用于筛选、查找和串联元素的方法。
			jQuery 参考手册 - 遍历 函数 描述 .add() 将元素添加到匹配元素的集合中. .andSelf() 把堆栈中之前的元素集添加到当前集合中. .children() 获得匹配元素集合中每个 ... 
- CUDA三维数组
			http://hpcbbs.it168.com/forum.php?mod=viewthread&tid=1643 根据上面链接的帖子研究了下三维数组,就像他自己说的一样是有问题的,我自己修改 ... 
- 第25章 	串行FLASH文件系统FatFs—零死角玩转STM32-F429系列
			第25章 串行FLASH文件系统FatFs 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.c ... 
- C#声明方法
			一.声明方法 方法是类中用于执行计算或其它行为的成员. 方法可以分为: ?静态方法:可以通过类进行访问.?实例方法:可以通过类的对象进行访问. 1. C#方法的声明 声明方法的语法格式如下: 访问修饰 ... 
- 深入理解JVM类加载机制 classloader
			转自https://www.cnblogs.com/ygj0930/p/6536048.html 
