今天继续跟着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)
}
}
坑2、in运算符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();
此外,num在java8后可以不声明为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不知道是啥子?