Lambda

一、集合的创建和遍历

    一般的集合主要就是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();

你可能感兴趣的:(Lambda)