一、概述
上几期,我们是完整的学完了java异常类的学习及实战演示、以及学习了线程进程等基础概念,而这一期,我们要来玩点好的东西,那就是java8,我们都知道java8是自2004年发布java5之后最重要且一次重大的版本更新,虽然我们的JDK环境 也升级到了java1.8,但是在日常的开发过程中,使用最多的编程风格还是停留在 JDK1.7版本。
那对于java1.8,你们有了解多少它相关的新特性呢?至于java8,于2013年9月正式发布,距离至今已快十年载了,想必大家对它的新特性大大小小也耳濡目染了些吧?那么趁着今天这个空闲日子,我就跟大家一起来聊聊它-java8之新特性。
二、本期教学目标
- java8有哪些新特性
- 什么是函数式接口
- 什么是Lambda表达式
- 掌握Stream Api
- Stream和Collect集合区别
- Stream创建方式
- Stream操作三步骤
三、正文
1️⃣java8新特性
2️⃣什么是Lambda表达式
1️⃣可选类型声明
2️⃣可选的参数圆括号
3️⃣可选的大括号
4️⃣可选的返回关键字
... ...
以上第1、2点内容,我是总结到了该篇《java零基础入门-java8新特性(上篇)》,需要的小伙伴可以去传送门直接去。
3️⃣什么是函数式接口
总而言之:函数式接口,即适用于函数式编程场景的接口。而Java中的函数式编程体现就是Lambda表达式,所以函数式接口就是可以适用于Lambda使用的接口。只有确保接口中有且仅有一个抽象方法,Java中的Lambda才能顺利地进行推导。
4️⃣掌握Stream Api
总而言之,何为Stream流,Stream是Java8中处理集合的关键抽象概念,它可以指定你对集合进行一些处理操作,比如对集合进行非常复杂的查找、过滤和映射数据等操作。
... ...
以上第3、4点内容,我是总结到了该篇《java零基础入门-java8新特性(中篇)》。需要的小伙伴可以去传送门直接去。
5️⃣Stream和Collections区别
说起Stream流,那肯定会想到Collections类,对比它两,你们知道,它两之间有何联系,又有何异同呢?这点,想必你们在上一期既然学了,那对于你们而言,肯定是要有所准备的啊。
见名知意,既然称Stream为流,而Collections为集合工具类,那自然好区别,Stream流是一个集合元素的函数模型,而Collections是对元素集合进行的操作,而它本身也是一个集合,而Stream流不是集合,更不是数据结构,其本身也不存储任何元素,但它可以操作元素进行任何操作,是一种对元素的处理方案。
且对于Stream流而言,Stream流属于管道流,只能被消费一次,比如第一次Stream流调用完,数据就会被处理后转到下一个Stream流上,而上一个Stream流就会关闭掉,不能再调用了。但是对于Collections,它不是,本身也是一个集合,即使是处理完了,也能还被接着调用。
我可以给大家举个例子:这样大家就好理解了:
List<String> list = new ArrayList<>();//采用工具类往集合中一并添加元素Collections.addAll(list, "a", "b", "c", "d");list.sort(new Comparator<String>() {@Overridepublic int compare(String o1, String o2) {return o2.charAt(0) - o1.charAt(0);}});
而对于Stream而言,它就是排序完后就结束了,转为下一个Stream。
@Testpublic void testSort() {List<String> list = new ArrayList<>();//采用工具类往集合中一并添加元素Collections.addAll(list, "a", "b", "c", "d");Stream<String> sorted = list.stream().sorted();}
这样对比,你们就明白了吧。
6️⃣Stream创建方式
上一期第四点也是讲述了其Stream流,而这一期,我们就要真正的来学习,到底如何使用它,毕竟学以致用就是这么来的,希望你们在学完后,也能对此有一定的启发与实战练习,能把它用上当前的项目上,毕竟用过后,还是很便捷的,对于其中有些api比起自己手动处理真的方便不少,而且执行效率也比你自己处理的快得多。
说了这么多,可能大家都还不是很清楚Stream到底怎么创建,并且它有几种创建方式呢?这点你们大家有课余时间自行了解过吗?除了最直接的创建方式,就是直接对集合进行调用stream()方法即可,就是通过集合的方式,那除了这种方式还有其他的吗?
如下是我总结的四种创建Stream流的方法:
- 通过集合创建Stream流。
比如:list.stream();
- 通过数组创建Stream流。
比如:Arrays.stream(arr);
- 通过Stream.of()方法Stream流。
比如:Stream.of("a","b");
- 通过Stream.iterate(),创建无限流。
比如:Stream.iterate()
如下,我具体展开给大家讲解一下吧,具体如何创建,并且实测如何玩转Stream流。
第一种:通过集合创建Stream流。
代码演示如下:
/*** 第一种:通过集合创建Stream流*/@Testpublic void testCreateStream1() {//创建一个集合//存放全班同学姓名集合List<String> stus = new ArrayList<>();stus.add("马超");stus.add("李白");//使用Stream计数。long count = stus.stream().count();}
第二种:通过数组创建Stream流。
代码演示如下:
/*** 第二种:通过数组创建Stream流*/@Testpublic void testCreateStream2() {//创建一个数组String[] arr = new String[10];long count = Arrays.stream(arr).count();}
第三种:通过Stream.of()方法Stream流。
代码演示如下:
/*** 第三种:通过Stream.of()方法Stream流*/@Testpublic void testCreateStream3() {//定义一个数组。String[] arr = new String[10];long count = Stream.of(arr).count();}
第四种:通过Stream.iterate(),创建无限流。
代码演示如下:
/*** 第四种:通过Stream.iterate(),创建无限流。*/@Testpublic void testCreateStream4() {Stream<Integer> stream = Stream.iterate(0, x -> x + 2).limit(10);long count = stream.count();System.out.println(count);}
如上我需要解释一下,代码啥意思,这是从x=0开始,然后获取0-10之间的偶数,然后再计数0-10之间共有多少个偶数。
...
而对于具体打印,就是计数该集合或数组中的元素个数。比如对于示例1返回自然是2。因为总共就两个元素。
打印结果截图如下:
7️⃣Stream操作三步骤
我们在上一节点,学完了对Stream流如何创建,及多种方式如何进行创建,对吧,那你们知道其Stream流的操作步骤不?因为直接用,肯定不会很太注意它是如何工作的。
如下是总结的Stream操作的三步骤,
- 创建Stream。
- 操作Stream。
- 终止操作。
具体怎么理解呢?第一步:创建Stream,对于一个数据源(如集合、数组),先获取一个流。
接着是操作Stream流,讲的是一个中间操作链,对数据源进行对应的操作,其中可以进行多次操作,每操作一次,就生成一个新的Stream。而最后一步,终止操作,就是执行中间链操作处理出结果。
具体我用代码给大家演示一下吧:
@Testpublic void testOperaStream() {//创建一个集合//存放全班同学姓名集合List<String> stus = new ArrayList<>();stus.add("马超");stus.add("化马");stus.add("李白");stus.add("马儿");//筛选出带姓马的同学Stream<String> stream1 = stus.stream().filter(stu -> stu.startsWith("马"));//对姓马的同学进行排序Stream<String> stream2 = stream1.sorted();//打印排序后姓马的同学名字stream2.forEach(stu -> {System.out.println(stu);});}
先是通过一个集合来创建stream流,完了之后其中操作了其stream流,其中stream1、stream2就是在操作stream的中间过程,然后最后打印输出是终止操作。
如下是最终执行结果。
所以对于stream流,并不是你们想象的那么难,只要你们能好好对其进行挖掘,并且学一下常用的那些api方法,其实就足够了。