PDF 课件和源代码下载地址:
https://gitee.com/geektime-geekbang/LetsJava
作者回复: lambda是很骚的操作,慎用,勿闪腰😄
作者回复: 可惜不是,不过我觉得陕西的面食美滴很。
作者回复: 变量要变,就会带来复杂的管理。因为可能很多代码/线程都可能改这个数据,就需要有管理的逻辑。final就是让数字不再变化,这样就可以做很多优化,也可以简化很多实现。比如你提到的lambda里用到的外面的“变量”,必须得是final的,否则实现起来太麻烦。
作者回复: 是的
作者回复: 👍
作者回复: 这是静态方法里的范型 对于<T> Predicate<T>,前面的<T> 是定义范型类型,T就是范型类型。Predicate<T>代表返回值,可以用前面定义的范型的类型,当然也可以不用。 具体T是个啥呢?和类的范型类似,编译的时候根据使用这个静态方法的地方来推断。
作者回复: collect执行的是传递给它的函数,也就是Collectors.toList()这个方法返回的函数(注意,不是toList,而是toList的返回值)
作者回复: myList.stream().filter(s -> s.length() > 4).map(String::toUpperCase).forEach(System.out::println); 等价于下面的几个表达式: Stream s = myList.stream(); s = s.filter(s -> s.length() > 4); s = s.map(String::toUpperCase); s.forEach(System.out::println); 所以map是Stream里的一个方法。不要和数据结构里的map混淆了。这里的map的意思是映射,转换,吧stream里的元素经过参数里指定的函数进行转换/映射,得到一个新的stream
作者回复: 嗯呐,我的感觉就是,Java确实改变比较慢。但是原因是现在Java的用户也多,保守也是必要的。只有确实有价值的功能才去增加,看上去很美,也要经过实验验证,再吸收。 谁来做实验呢?世界上不是有很多别的语言嘛,哈哈
作者回复: lambda概念里的本质是方法,或者说是函数。 但是Java里一等公民只有class(接口也算在类里面)。接受lambda表达式的地方,参数类型都会是一个接口。 那么在这个使用接口引用操作对象的地方,这个接口引用指向的是什么呢?肯定就是一个类的实例。只是说这个类本身是自动创建出来的,而不需要我们去写而已。 当然JVM上跑的语言很多,可能很多地方将接口这种细节也隐藏掉了。