学习kotlin第三天

时间:2021-09-02 20:53:59

今天继续跟着kotlin官方文档踩坑,还是那句话,仅为记录我的学习过程,不喜勿喷。学习kotlin第三天为什么一发表文字颜色和格式就变了,都发了三遍了。

1、对集合进行迭代,这个在上一篇已经见过,类似于java中的foreach遍历。

我忽然有个疑问,啥子是迭代?百度上搜了下

 1,循环(loop,指的是在满足条件的情况下,重复执行同一段代码。比如,while语句。循环则能对应集合,列表,数组等,也能对执行代码进行操作。

 2,迭代(iterate),指的是按照某种顺序逐个访问列表中的每一项。比如,for语句。迭代只能对应集合,列表,数组等。不能对执行代码进行迭代。

 3,遍历(traversal),指的是按照一定的规则访问树形结构中的每个节点,而且每个节点都只访问一次。   遍历同迭代一样,也不能对执行代码进行遍历。

 4,递归(recursion),指的是一个函数不断调用自身的行为。比如,以编程方式输出著名的斐波纳契数列

额,循环和递归好理解,这迭代和遍历真不好区分。我在java中的理解是foreach迭代时不能动集合,否则就报并发修改异常ConcurrentModificationException。这里估计也差不多吧?

funmain(args: Array<String>) {
    valitems=listOf("apple","banana","pear")
    for(iteminitems){
        println(item)
    }
}

2in运算符when表达式以及集合的综合使用,这个好理解。

funmain(args: Array<String>) {
    valitems =setOf("grape","banana","pear")
    when{
        "orange"initems ->println("juicy")
        "grape"initems ->println("apple is fine too")
    }
}

突然发现这里是setOf而不是listOf,是无序的意思吗?

3、使用 lambda表达式来过滤(filter)和映射(map)集合:

funmain(args: Array<String>) {
    valfruits =listOf("banana","avocado","apple","kiwi")
    fruits
            .filter{ it.startsWith("a")}
            
.sortedBy{ it }
            
.map{ it.toUpperCase()}
            
.forEach{println(it)}
}

 额,香菇,我都没学过lambda表达式,先恶补一下。

1、java8中引入了新的操作符“->”箭头操作符,箭头操作符将lambda表达式拆分成两部分。

左侧:lambda表达式的参数列表。即接口中抽象方法的参数列表

右侧:lambda表达式中所需执行的功能,即lambda体。即接口中抽象方法的实现。

2、语法格式一:无参数、无返回值。例如Runnable接口的实现

intnum=0;
Runnable runnable = () -> System.out.println("hello"+(num++));
runnable.run();

此外,numjava8后可以不声明为final类型,但仍然是final类型,故num++报错

Variable used in lambda expression should be final or effectively final

语法格式二:一个参数,无返回值

Consumer<String> consumer = (x) -> System.out.println(x);
consumer.accept("我好帅");

语法格式三:只有一个参数,小括号可以省略,习惯上还是写了的

Consumer<String> consumer = x -> System.out.println(x);
consumer.accept("我好帅");

语法格式四:有多个参数,有返回值,并且lambda表达式中有多条语句

Comparator<Integer> com = (x, y) -> {
    System.out.println(x);
    System.out.println(y);
    returnInteger.compare(x, y);
};

语法格式五:有多个参数,有返回值,并且lambda表达式中只有一条语句,则return和大括号都可以省略。

Comparator<Integer> com = (x, y) ->  Integer.compare(x, y);

语法格式六:lambda表达式的参数列表的数据类型可以省略不写,

 (Integerx,Integer y) ->  Integer.compare(x, y);

因为jvm编译器能根据上下文推断出数据类型,即“类型推断”。

String[] strs={"aaa","bbb","ccc"};
List<String> list=newArrayList<>();

Java8中对类型推断进行了升级

public static voidmain(String[] args) {

   show(newHashMap<>());
}
public static voidshow(Map<String, Integer> map) {
}

3、lambda表达式需要“函数式接口”的支持

函数式接口:接口中只有一个抽象方法的接口,称为函数式接口,可以用注解@FunctionalInterface修饰。可以检查是否是函数式接口。

今天就差不多到这里吧,回头看一眼,.filter.sortedBy.map.forEach,四个函数似乎和java中的Stream类里面的方法类似,至于里面那个it不知道是啥子?