Kotlin内置过滤器 Xx「T」.filter

顾名思义,.filter是一个过滤器。[官方filter](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/filter.html)
我们可以看看官方的一个简单例子:
	//声明一个集合
	val numbers: List<Int> = listOf(1, 2, 3, 4, 5, 6, 7)  
	//过滤取得对2取余为0的元素(或者说过滤掉集合元素对2取余不为0的元素)
	val evenNumbers = numbers.filter { it % 2 == 0 }  
	//过滤掉元素对3取余为0的元素,也可以简化为{ it % 3 == 0 }  
	val notMultiplesOf3 = numbers.filterNot { number -> number % 3 == 0 } 

	println(evenNumbers) // [2, 4, 6]
	println(notMultiplesOf3) // [1, 2, 4, 5, 7]

你可以将代码复制到 kotlin在线测试工具,测试一下。

再来看复杂一点的数据结构的例子:

//声明一个Map,并初始化
val originalMap = mapOf("key1" to 1, "key2" to 2, "key3" to 3)
//过滤取得map.value的值<2的map,map是以键值对的形式存在的。
val filteredMap = originalMap.filter { it.value < 2 }

//map.value < 2 只有map<"key1",1>
println(filteredMap) // {key1=1}
//注意这种输出格式,map元素包裹在{}里
println(originalMap) // {key1=1, key2=2, key3=3}

//声明了一个不需要匹配条件的变量,实际上已初始为map.value=0的过滤条件
val nonMatchingPredicate: ((Map.Entry<String, Int>)) -> Boolean = { it.value == 0 }
//过滤取得map.value=0的元素,实际上在map中并没有存在,所以为空,即{}
val emptyMap = originalMap.filter(nonMatchingPredicate)
println(emptyMap) // {}

我们来分析一下源码:


/**
 * Returns a list containing only elements matching the given [predicate].
 * 翻译:返回一个只包含与给定的[过滤条件]匹配的元素的列表
 * 再翻译:返回一个满足筛选条件的列表,这实际上简化了我们编程去实现这一功能,在Java中就比较麻烦了
 */
public inline fun <T> Iterable<T>.filter(predicate: (T) -> Boolean): List<T> {
    return filterTo(ArrayList<T>(), predicate)
}

这是一个顶层的内联函数,内联函数非常方便我们调用。简单说明一下内联函数。在调用内联函数时,会自动加载函数的代码到使用处,而不加经过出入栈的调用和返回,性能比较高,而在顶层更容易被调用到。

再后面那一句return不在本次的讨论范围。

总结:.filter(过滤条件),这个过滤条件可以在内部声明也可以在外部声明,但是内部声明显然更简单。总之 .filte()实际上是返回一个满足筛选条件的列表。

你可能感兴趣的:(kotlin)