三、JDK8新特性Stream流各位同学接下来我们学习一个全新的知识叫做Stream流也叫Stream API。它是从JDK8以后才有的一个新特性是专业用于对集合或者数组进行便捷操作的。有多方便呢什么是Stream也叫Stream流是JDK8开始新增的一套API (java.util.stream.*)可以用于操作集合或者数组的数据。优势Stream流大量的结合了Lambda的语法风格来编程提供了一种更加强大更加简单的方式操作集合或者数组中的数据代码更简洁可读性更好。我们用一个案例体验一下然后再详细学习。3.1 Stream流体验案例需求有一个List集合元素有张三丰,张无忌,周芷若,赵敏,张强找出姓张且是3个字的名字存入到一个新集合中去。public class StreamTest { public static void main(String[] args) { // 创建集合 ListString names new ArrayList(); // 批量存储数据 Collections.addAll(names, 张三丰,张无忌,周芷若,赵敏,张强); // 打印集合 System.out.println(names); } }用传统方式来做代码是这样的// 找出姓张且是3个字的名字存入到一个新集合中去。 ListString list new ArrayList(); for (String name : names) { if(name.startsWith(张) name.length() 3){ list.add(name); } } System.out.println(list);用Stream流来做代码是这样的ps: 是不是想流水线一样一句话就写完了ListString list2 names.stream().filter(s - s.startsWith(张) s.length() 3) .collect(Collectors.toList()); System.out.println(list2); System.out.println(-----------------------------); ListString list3 names.stream().filter(s - s.startsWith(张)).filter(a - a.length() 3).collect(Collectors.toList()); System.out.println(list3);先不用知道这里面每一句话是什么意思具体每一句话的含义待会再一步步学习。现在只是体验一下。学习Stream流我们接下来会按照下面的步骤来学习。3.2 Stream流的创建好接下来我们正式来学习Stream流。先来学习如何创建Stream流、或者叫获取Stream流。如何获取Stream流?获取 集合 的Stream流Collection提供的如下方法说明default StreamE stream()获取当前集合对象的Stream流获取 数组 的Stream流Arrays类提供的如下 方法说明public static T StreamT stream(T[] array)获取当前数组的Stream流Stream类提供的如下 方法说明public staticT StreamTof(T... values)获取当前接收数据的Stream流直接上代码演示/** * 目标掌握Stream流的创建。 */ public class StreamTest2 { public static void main(String[] args) { // 1. 如何获取list集合的Stream流 ListString list new ArrayList(); Collections.addAll(list, 张三丰,张无忌,周芷若,赵敏,张强); StreamString stream list.stream(); // 2. 如何获取set集合的Stream流 SetString set new HashSet(); Collections.addAll(set, 刘德华,张曼玉,蜘蛛精,马德,德玛西亚); StreamString stream1 set.stream(); // 3. 如何获取map集合的Stream流 MapString, Double map new HashMap(); map.put(古力娜扎, 172.3); map.put(迪丽热巴, 168.3); map.put(马尔扎哈, 166.3); map.put(卡尔扎巴, 168.3); // 通过获取所有key 再获取stream流 SetString keys map.keySet(); StreamString ks keys.stream(); // 通过获取所有value 再获取stream流 CollectionDouble values map.values(); StreamDouble vs values.stream(); // 通过获取entry对象 再获取stream流 SetMap.EntryString, Double entries map.entrySet(); StreamMap.EntryString, Double kvs entries.stream(); kvs.filter(s - s.getKey().contains(扎)).collect(Collectors.toList()) .forEach(s - System.out.println(s.getKey() -- s.getValue())); // 4. 如何获取数组的Stream流 String[] names {张翠山, 东方不败, 唐大山, 独孤求败}; StreamString s1 Arrays.stream(names); StreamString s2 Stream.of(names); } }3.3 Stream流中间方法在上一节我们学习了创建Stream流的方法。接下来我们再来学习Stream流中间操作的方法。中间方法指的是调用完方法之后其结果是一个新的Stream流于是可以继续调用方法这样一来就可以支持链式编程或者叫流式编程。话不多说直接上代码演示/** * 目标掌握Stream流提供的常见中间方法。 */ public class StreamTest3 { public static void main(String[] args) { // 创建list集合 ListDouble scores new ArrayList(); Collections.addAll(scores, 88.5, 100.0, 60.0, 99.0, 9.5, 99.6, 25.0); System.out.println(scores); // 需求1找出成绩大于等于60分的数据并升序后再输出。 scores.stream().filter(s - s 60).sorted().forEach(s - System.out.println(s)); System.out.println(------------------------------------------------); ListStudent students new ArrayList(); Student s1 new Student(蜘蛛精, 26, 172.5); Student s2 new Student(蜘蛛精, 26, 172.5); Student s3 new Student(紫霞, 23, 167.6); Student s4 new Student(白晶晶, 25, 169.0); Student s5 new Student(牛魔王, 35, 183.3); Student s6 new Student(牛夫人, 34, 168.5); Collections.addAll(students, s1, s2, s3, s4, s5, s6); // 需求2找出年龄大于等于23,且年龄小于等于30岁的学生并按照年龄降序输出. students.stream().filter(s - s.getAge() 23 s.getAge() 30) .sorted(((o1, o2) - o2.getAge() - o1.getAge())) .forEach(s - System.out.println(s)); System.out.println(------------------------------------------------); // 需求3取出身高最高的前3名学生并输出。 students.stream().sorted(((o1, o2) - Double.compare(o2.getHeight(), o1.getHeight()))) .limit(3) .forEach(s - System.out.println(s)); System.out.println(------------------------------------------------); // 需求4取出身高倒数的2名学生并输出。 s1 s2 s3 s4 s5 s6 students.stream().sorted(((o1, o2) - Double.compare(o2.getHeight(), o1.getHeight()))) .skip(students.size() - 2) .forEach(s - System.out.println(s)); System.out.println(------------------------------------------------); // 需求5找出身高超过168的学生叫什么名字要求去除重复的名字再输出。 students.stream().filter(s - s.getHeight() 168) .map(Student::getName) .distinct() .forEach(System.out::println); System.out.println(------------------------------------------------); // distinct去重复自定义类型的对象希望内容一样就认为重复重写hashCode,equals students.stream().filter(s - s.getHeight() 168) .distinct() .forEach(System.out::println); System.out.println(------------------------------------------------); // 合并a和b两个流为一体 StreamString st1 Stream.of(张三, 李四); StreamString st2 Stream.of(张三2, 李四2, 王五); StreamString allSt Stream.concat(st1, st2); allSt.forEach(System.out::println); } }3.4 Stream流终结方法最后我们再学习Stream流的终结方法。这些方法的特点是调用完方法之后其结果就不再是Stream流了所以不支持链式编程。我列举了下面的几个终结方法接下来用几个案例来一个一个给同学们演示。收集Stream流就是把Stream流操作后的结果转回到集合或者数组中去返回。Stream流方便操作集合/数组的手段集合/数组才是开发中的目的。话不多说直接上代码/** * 目标Stream流的终结方法 */ public class StreamTest4 { public static void main(String[] args) { ListStudent students new ArrayList(); Student s1 new Student(蜘蛛精, 26, 172.5); Student s2 new Student(蜘蛛精, 26, 172.5); Student s3 new Student(紫霞, 23, 167.6); Student s4 new Student(白晶晶, 25, 169.0); Student s5 new Student(牛魔王, 35, 183.3); Student s6 new Student(牛夫人, 34, 168.5); Collections.addAll(students, s1, s2, s3, s4, s5, s6); // 需求1请计算出身高超过168的学生有几人。 long size students.stream().filter(s - s.getHeight() 168).count(); System.out.println(size); // 需求2请找出身高最高的学生对象并输出。 Student s students.stream().max((o1, o2) - Double.compare(o1.getHeight(), o2.getHeight())).get(); System.out.println(s); // 需求3请找出身高最矮的学生对象并输出。 Student ss students.stream().min((o1, o2) - Double.compare(o1.getHeight(), o2.getHeight())).get(); System.out.println(ss); // 需求4请找出身高超过170的学生对象并放到一个新集合中去返回。 // 流只能收集一次。 ListStudent students1 students.stream().filter(a - a.getHeight() 170).collect(Collectors.toList()); System.out.println(students1); SetStudent students2 students.stream().filter(a - a.getHeight() 170).collect(Collectors.toSet()); System.out.println(students2); // 需求5请找出身高超过170的学生对象并把学生对象的名字和身高存入到一个Map集合返回。 MapString, Double map students.stream().filter(a - a.getHeight() 170) .distinct().collect(Collectors.toMap(a - a.getName(), a - a.getHeight())); System.out.println(map); // Object[] arr students.stream().filter(a - a.getHeight() 170).toArray(); Student[] arr students.stream().filter(a - a.getHeight() 170).toArray(len - new Student[len]); System.out.println(Arrays.toString(arr)); } }到这里关于Stream流的操常见操作我们就已经学习完了。当然Stream流还有一些其他的方法同学们遇到了也可以自己再研究一下。
JDK8 Stream流:高效集合操作新利器
三、JDK8新特性Stream流各位同学接下来我们学习一个全新的知识叫做Stream流也叫Stream API。它是从JDK8以后才有的一个新特性是专业用于对集合或者数组进行便捷操作的。有多方便呢什么是Stream也叫Stream流是JDK8开始新增的一套API (java.util.stream.*)可以用于操作集合或者数组的数据。优势Stream流大量的结合了Lambda的语法风格来编程提供了一种更加强大更加简单的方式操作集合或者数组中的数据代码更简洁可读性更好。我们用一个案例体验一下然后再详细学习。3.1 Stream流体验案例需求有一个List集合元素有张三丰,张无忌,周芷若,赵敏,张强找出姓张且是3个字的名字存入到一个新集合中去。public class StreamTest { public static void main(String[] args) { // 创建集合 ListString names new ArrayList(); // 批量存储数据 Collections.addAll(names, 张三丰,张无忌,周芷若,赵敏,张强); // 打印集合 System.out.println(names); } }用传统方式来做代码是这样的// 找出姓张且是3个字的名字存入到一个新集合中去。 ListString list new ArrayList(); for (String name : names) { if(name.startsWith(张) name.length() 3){ list.add(name); } } System.out.println(list);用Stream流来做代码是这样的ps: 是不是想流水线一样一句话就写完了ListString list2 names.stream().filter(s - s.startsWith(张) s.length() 3) .collect(Collectors.toList()); System.out.println(list2); System.out.println(-----------------------------); ListString list3 names.stream().filter(s - s.startsWith(张)).filter(a - a.length() 3).collect(Collectors.toList()); System.out.println(list3);先不用知道这里面每一句话是什么意思具体每一句话的含义待会再一步步学习。现在只是体验一下。学习Stream流我们接下来会按照下面的步骤来学习。3.2 Stream流的创建好接下来我们正式来学习Stream流。先来学习如何创建Stream流、或者叫获取Stream流。如何获取Stream流?获取 集合 的Stream流Collection提供的如下方法说明default StreamE stream()获取当前集合对象的Stream流获取 数组 的Stream流Arrays类提供的如下 方法说明public static T StreamT stream(T[] array)获取当前数组的Stream流Stream类提供的如下 方法说明public staticT StreamTof(T... values)获取当前接收数据的Stream流直接上代码演示/** * 目标掌握Stream流的创建。 */ public class StreamTest2 { public static void main(String[] args) { // 1. 如何获取list集合的Stream流 ListString list new ArrayList(); Collections.addAll(list, 张三丰,张无忌,周芷若,赵敏,张强); StreamString stream list.stream(); // 2. 如何获取set集合的Stream流 SetString set new HashSet(); Collections.addAll(set, 刘德华,张曼玉,蜘蛛精,马德,德玛西亚); StreamString stream1 set.stream(); // 3. 如何获取map集合的Stream流 MapString, Double map new HashMap(); map.put(古力娜扎, 172.3); map.put(迪丽热巴, 168.3); map.put(马尔扎哈, 166.3); map.put(卡尔扎巴, 168.3); // 通过获取所有key 再获取stream流 SetString keys map.keySet(); StreamString ks keys.stream(); // 通过获取所有value 再获取stream流 CollectionDouble values map.values(); StreamDouble vs values.stream(); // 通过获取entry对象 再获取stream流 SetMap.EntryString, Double entries map.entrySet(); StreamMap.EntryString, Double kvs entries.stream(); kvs.filter(s - s.getKey().contains(扎)).collect(Collectors.toList()) .forEach(s - System.out.println(s.getKey() -- s.getValue())); // 4. 如何获取数组的Stream流 String[] names {张翠山, 东方不败, 唐大山, 独孤求败}; StreamString s1 Arrays.stream(names); StreamString s2 Stream.of(names); } }3.3 Stream流中间方法在上一节我们学习了创建Stream流的方法。接下来我们再来学习Stream流中间操作的方法。中间方法指的是调用完方法之后其结果是一个新的Stream流于是可以继续调用方法这样一来就可以支持链式编程或者叫流式编程。话不多说直接上代码演示/** * 目标掌握Stream流提供的常见中间方法。 */ public class StreamTest3 { public static void main(String[] args) { // 创建list集合 ListDouble scores new ArrayList(); Collections.addAll(scores, 88.5, 100.0, 60.0, 99.0, 9.5, 99.6, 25.0); System.out.println(scores); // 需求1找出成绩大于等于60分的数据并升序后再输出。 scores.stream().filter(s - s 60).sorted().forEach(s - System.out.println(s)); System.out.println(------------------------------------------------); ListStudent students new ArrayList(); Student s1 new Student(蜘蛛精, 26, 172.5); Student s2 new Student(蜘蛛精, 26, 172.5); Student s3 new Student(紫霞, 23, 167.6); Student s4 new Student(白晶晶, 25, 169.0); Student s5 new Student(牛魔王, 35, 183.3); Student s6 new Student(牛夫人, 34, 168.5); Collections.addAll(students, s1, s2, s3, s4, s5, s6); // 需求2找出年龄大于等于23,且年龄小于等于30岁的学生并按照年龄降序输出. students.stream().filter(s - s.getAge() 23 s.getAge() 30) .sorted(((o1, o2) - o2.getAge() - o1.getAge())) .forEach(s - System.out.println(s)); System.out.println(------------------------------------------------); // 需求3取出身高最高的前3名学生并输出。 students.stream().sorted(((o1, o2) - Double.compare(o2.getHeight(), o1.getHeight()))) .limit(3) .forEach(s - System.out.println(s)); System.out.println(------------------------------------------------); // 需求4取出身高倒数的2名学生并输出。 s1 s2 s3 s4 s5 s6 students.stream().sorted(((o1, o2) - Double.compare(o2.getHeight(), o1.getHeight()))) .skip(students.size() - 2) .forEach(s - System.out.println(s)); System.out.println(------------------------------------------------); // 需求5找出身高超过168的学生叫什么名字要求去除重复的名字再输出。 students.stream().filter(s - s.getHeight() 168) .map(Student::getName) .distinct() .forEach(System.out::println); System.out.println(------------------------------------------------); // distinct去重复自定义类型的对象希望内容一样就认为重复重写hashCode,equals students.stream().filter(s - s.getHeight() 168) .distinct() .forEach(System.out::println); System.out.println(------------------------------------------------); // 合并a和b两个流为一体 StreamString st1 Stream.of(张三, 李四); StreamString st2 Stream.of(张三2, 李四2, 王五); StreamString allSt Stream.concat(st1, st2); allSt.forEach(System.out::println); } }3.4 Stream流终结方法最后我们再学习Stream流的终结方法。这些方法的特点是调用完方法之后其结果就不再是Stream流了所以不支持链式编程。我列举了下面的几个终结方法接下来用几个案例来一个一个给同学们演示。收集Stream流就是把Stream流操作后的结果转回到集合或者数组中去返回。Stream流方便操作集合/数组的手段集合/数组才是开发中的目的。话不多说直接上代码/** * 目标Stream流的终结方法 */ public class StreamTest4 { public static void main(String[] args) { ListStudent students new ArrayList(); Student s1 new Student(蜘蛛精, 26, 172.5); Student s2 new Student(蜘蛛精, 26, 172.5); Student s3 new Student(紫霞, 23, 167.6); Student s4 new Student(白晶晶, 25, 169.0); Student s5 new Student(牛魔王, 35, 183.3); Student s6 new Student(牛夫人, 34, 168.5); Collections.addAll(students, s1, s2, s3, s4, s5, s6); // 需求1请计算出身高超过168的学生有几人。 long size students.stream().filter(s - s.getHeight() 168).count(); System.out.println(size); // 需求2请找出身高最高的学生对象并输出。 Student s students.stream().max((o1, o2) - Double.compare(o1.getHeight(), o2.getHeight())).get(); System.out.println(s); // 需求3请找出身高最矮的学生对象并输出。 Student ss students.stream().min((o1, o2) - Double.compare(o1.getHeight(), o2.getHeight())).get(); System.out.println(ss); // 需求4请找出身高超过170的学生对象并放到一个新集合中去返回。 // 流只能收集一次。 ListStudent students1 students.stream().filter(a - a.getHeight() 170).collect(Collectors.toList()); System.out.println(students1); SetStudent students2 students.stream().filter(a - a.getHeight() 170).collect(Collectors.toSet()); System.out.println(students2); // 需求5请找出身高超过170的学生对象并把学生对象的名字和身高存入到一个Map集合返回。 MapString, Double map students.stream().filter(a - a.getHeight() 170) .distinct().collect(Collectors.toMap(a - a.getName(), a - a.getHeight())); System.out.println(map); // Object[] arr students.stream().filter(a - a.getHeight() 170).toArray(); Student[] arr students.stream().filter(a - a.getHeight() 170).toArray(len - new Student[len]); System.out.println(Arrays.toString(arr)); } }到这里关于Stream流的操常见操作我们就已经学习完了。当然Stream流还有一些其他的方法同学们遇到了也可以自己再研究一下。