一、集合的创建和遍历
一般的集合主要就是List、Set和Map。List的主要实现类是ArrayList和LinkedList,Set的主要实现类是HashSet,Map的主要实现类是HashMap
1、集合的创建
val list = listOf("apple", "orange", "pear")
不过listOf()函数创建的是一个不可变集合,创建可变集合用mutableListOf()函数。
val map = mapOf("apple" to 1, "orange" to 2, "pear" to 3)
2、集合的函数式API
如果要在水果集合里找到单词最长的那个水果,可以用如下代码:
val maxLengthFruit = list.maxBy{it.length};
上述表达式使用了Lambda表达式的语法结构,只需一行代码就可以实现该功能。
3、Lambda的语法结构:
{参数名1: 参数类型, 参数名2: 参数类型 -> 函数体}
最外层是一对大括号。如有参数传入Lambda表达式,需要声明参数列表;参数列表结尾用->表示参数列表的结束以及函数体的开始。在函数体中,可以编写任意行代码,并且最后一行代码会自动作为返回值。
当然,Lambda表达式更多的是简化写法,以上述表达式为例:
val lambda = {fruit : String -> fruit.length};
val maxLengthFruit = list.maxBy(lambda);
等价于 val maxLengthFruit = list.maxBy({fruit : String -> fruit.length});
Kotlin规定:如果Lambda表达式是函数的最后一个参数时,可将Lambda表达式移到函数括号外面:
val maxLengthFruit = list.maxBy() {fruit : String -> fruit.length};
如果Lambda表达式是函数的唯一一个参数,可以省略括号:
val maxLengthFruit = list.maxBy{fruit : String -> fruit.length};
因为Kotlin有类型推导机制,所以大多数情况下,Lambda表达式中的参数列表可以不必声明参数类型:
val maxLengthFruit = list.maxBy{fruit -> fruit.length};
最后,当Lambda表达式的参数列表只有一个参数时,可不声明参数名,直接用it关键字代替:
val maxLengthFruit = list.maxBy{it.length};
4、Stream
1)什么是Stream:Stream是一个来自数据源的元素队列,并支持聚合操作
数据源:流的来源。可以是集合、数组、IO、产生器generator等
聚合操作:类似SQL语句一样的操作。比如filter、map、reduce、find、match、sorted等
2)生成流:
stream():为集合创建串行流
parallelStream():为集合创建并行流
3)forEach():迭代流中的每个数据
new Random().ints().limit(10).forEach(System.out::pringln());
4)filter():通过设置过滤条件,过滤数据
5)limit():获取指定数量的流
6)sorted():对流进行排序
7)Collectors:实现了很多归约操作,例如将流转换成集合和聚合元素。Collectors可用于返回列表或字符串
list.stream().filter(string -> !string.isEmpty()).collect(Collectors.toList());
list.stream().filter(string -> !string.isEmpty()).collect(Collectors.joining(","));
8)统计:另外,一些统计结果也非常有用。它们主要用于int、double、long等基本类型上。
IntSummaryStatistics stats = numbers.stream().mapToInt(x -> x).summaryStatistics();
stats.getMax(); stats.getMin(); stats.getSum(); stats.getAverage();