目录
2.1 对于 Collection 系列集合创建 Stream 流对象的方式
2.2 对于 Map 系列集合创建 Stream 流对象的方式
4.3 Stream 流的 max() 或者 min() 终结方法
Stream(流)是一种数据处理的概念,它可以用来处理集合、数组或输入/输出等数据源的元素序列。流可以看作是一个从源到目标的元素序列,可以通过一系列连续的操作对其进行处理。流的操作可以分为两种类型:中间操作和终端操作。中间操作是对流进行处理并返回一个新的流,而终端操作是对流进行最终的处理并返回一个结果或副作用。
主要以数组、集合来创建 Stream 流对象。
直接用集合对象.stream() 实例方法创建 Stream 流对象。
以代码的形式来具体介绍:
// List 集合系列来创建 Stream 流对象 Listlist = new ArrayList<>(); Collections.addAll(list,"张三","李四","王五","张麻子"); Streamstream = list.stream(); // Set 集合系列来创建 Stream 流对象 Setset = new HashSet<>(); Collections.addAll(set,"张三","李四","王五","张麻子"); Streamstream1 = set.stream();
具体来介绍两种方式:第一种方法;把键值对“封装”成一个整体。第二种方法;分别把集合中的键和值全部获取出来,单独放在各个集合中。
以代码的形式来具体介绍:
- // Map 集合系列来创建 Stream 流对象
- Map
m = new HashMap<>(); - m.put("张三",19);
- m.put("李四",28);
- m.put("王五",33);
- m.put("张麻子",22);
- //第一种方法:把键值对“封装”成一个整体
- Set
> entries = m.entrySet(); - Stream
> stream2 = entries.stream(); - //第二种方法:分别把集合中的键和值全部获取出来,单独放在系列集合中
- Set
k = m.keySet(); - Collection
v = m.values(); - Stream
stream3 = k.stream(); - Stream
stream4 = v.stream();
具体来介绍有两种方式来创建对象:第一种方法;用 Arrays.stream() 方法来创建。第二种方法;用 Stream.of() 方法来创建。
以代码的形式来具体介绍:
- // 用数组来创建 Stream 流对象
- String[] strings = new String[]{"张三","李四","王五","张麻子"};
- //第一种方法:用 Arrays.stream() 方法来创建
- Stream
stream5 = Arrays.stream(strings); -
- //第二种方法:用 Stream.of() 方法来创建
- Stream
stream6 = Stream.of(strings);
Stream 流的中间方法主要用于对流中的元素进行处理,返回一个新的流对象。这些中间方法可以组合使用,形成流水线式的处理流程,方便进行复杂的数据处理操作。
用于对流中的数据进行过滤。
通过具体代码实现:
import java.util.ArrayList; import java.util.Collections; import java.util.List; public class StreamIntermediateMethod { public static void main(String[] args) { Listlist = new ArrayList<>(); Collections.addAll(list,"张三","李四","王五","张麻子"); //对一下代码解读:首先用 stream() 得到了该集合的流, //然后用 filter() 用于对流中的数据进行过滤,也可以理解成筛选字符串中带有“张”的,返回新流, //该新流中都是含“张”的字符串,接着把流中的数据进行用 forEach() 方法进行遍历。 /*list.stream().filter(s -> s.contains("张")).forEach(s-> System.out.println(s));*/ //对以上代码稍微简化,如以下: list.stream().filter(s -> s.contains("张")).forEach(System.out::println); } }运行结果如下:
按照指定规则排序。
通过具体代码实现:
import java.util.ArrayList; import java.util.List; public class StreamIntermediateMethod { public static void main(String[] args) { Listlist = new ArrayList<>(); list.add(new Student("张三",19)); list.add(new Student("李四",22)); list.add(new Student("王五",17)); list.add(new Student("张麻子",33)); //解读以下代码:首先先利用 stream() 方法来获取该集合的流,然后用 sorted() 方法,由于是自定义类型的对象, //默认的 sorted() 方法是搞不定,所以需要重写方法,因此可以接入这个匿名内部类来重写内部的具体方法, //排完序之后会得到一个新的流,然后经过 forEach 方法来遍历该流中的数据。 list.stream().sorted((o1, o2)-> o1.getAge() - o2.getAge()).forEach(s-> System.out.println(s)); //以上代码话可以继续简化,效果是一样的 System.out.println("--------------------------------------------------------------------"); list.stream().sorted((o1, o2)-> o1.getAge() - o2.getAge()).forEach(System.out::println); } }运行结果如下:
获取前面 x 个元素。
通过具体代码实现:
import java.util.ArrayList; import java.util.List; public class StreamIntermediateMethod { public static void main(String[] args) { Listlist = new ArrayList<>(); list.add(new Student("张三",19)); list.add(new Student("李四",22)); list.add(new Student("王五",17)); list.add(new Student("张麻子",33)); //对一下代码进行解读:先获取该集合的流,然后用 limit(2) 中间方法,获取前面2个元素, //返回新流,接着对新流进行遍历输出元素 list.stream().limit(2).forEach(System.out::println); } }运行结果如下:
跳过前面 x 个元素。
通过具体代码实现:
import java.util.ArrayList; import java.util.List; public class StreamIntermediateMethod { public static void main(String[] args) { Listlist = new ArrayList<>(); list.add(new Student("张三",19)); list.add(new Student("李四",22)); list.add(new Student("王五",17)); list.add(new Student("张麻子",33)); //对一下代码进行解读:先得到该集合的流,然后用 skip(2) 中间方法,跳过前面2个元素, //得到的新流中包含后面两个元素,然后就进行遍历了。 list.stream().skip(2).forEach(System.out::println); } }运行结果如下:
对元素进行加工,并返回对应的新流。(映射)
通过代码具体实现:
import java.util.ArrayList; import java.util.List; public class StreamIntermediateMethod { public static void main(String[] args) { Listlist = new ArrayList<>(); list.add(new Student("张三",19)); list.add(new Student("李四",22)); list.add(new Student("王五",17)); list.add(new Student("张麻子",33)); //解读以下代码: 先得到该集合的流,然后调用 map() 中间方法, //将对应的元素进行加工,简单的来说就是,将原先的元素加工成自己想要的形式, //以下就是将学生类对象加工成字符串,["张三",19] -> "张三",每一个元素都是一一对应、映射的。 list.stream().map(s->s.getName()).forEach(System.out::println); } }运行结果如下:
去除流中重复的元素。但是对于自定义类型的元素,默认的 distinct() 方法是不能完成去除重复的元素。希望内容一样就认为重复,这就需要重写 hashCode() 与 equals() 方法。
通过代码具体实现:
import java.util.ArrayList; import java.util.List; public class StreamIntermediateMethod { public static void main(String[] args) { Listlist = new ArrayList<>(); list.add(new Student("张三",19)); list.add(new Student("李四",22)); list.add(new Student("王五",17)); list.add(new Student("张麻子",33)); list.add(new Student("张三",19)); //解读以下代码: 先获取该集合中的流,然后调用 distinct() 方法,但是该流中的元素是自定义, //所以希望内容一样就认为重复,这就需要重写 hashCode() 与 equals() 方法。 //去重后,返回一个新流。 list.stream().distinct().forEach(System.out::println); } }运行结果如下:
如果对重写 hashCode() 与 equals() 方法不太熟悉,可以点击以下链接去了解以下:
合并 a 和 b 两个流为一个流。
通过代码具体实现:
import java.util.ArrayList; import java.util.List; import java.util.stream.Stream; public class StreamIntermediateMethod { public static void main(String[] args) { Listlist = new ArrayList<>(); list.add(new Student("张三",19)); list.add(new Student("李四",22)); list.add(new Student("王五",17)); list.add(new Student("张麻子",33)); Listlist1 = new ArrayList<>(); list1.add(new Student("李麻子",23)); Streamstream = Stream.concat(list.stream(),list1.stream()); stream.forEach(System.out::println); } }运行结果如下:
Stream 流的终结方法用于对流进行最终的处理并返回一个结果或副作用。对流进行最终的处理并获取结果。需要注意的是,终结方法只能对流进行一次操作,一旦流被消费,就不能再次使用。
对此流运算后的元素执行后遍历。
通过代码具体实现:
import java.util.ArrayList; import java.util.List; import java.util.stream.Stream; public class StreamIntermediateMethod { public static void main(String[] args) { Listlist = new ArrayList<>(); list.add(new Student("张三",19)); list.add(new Student("李四",22)); list.add(new Student("王五",17)); list.add(new Student("张麻子",33)); Listlist1 = new ArrayList<>(); list1.add(new Student("李麻子",23)); Stream.concat(list.stream(),list1.stream()).forEach(System.out::println); } }运行结果如下:
统计此流运算后的元素个数。需要注意的是:返回值是 long 类型。
通过代码具体实现:
import java.util.ArrayList; import java.util.List; import java.util.stream.Stream; public class StreamIntermediateMethod { public static void main(String[] args) { Listlist = new ArrayList<>(); list.add(new Student("张三",19)); list.add(new Student("李四",22)); list.add(new Student("王五",17)); list.add(new Student("张麻子",33)); Listlist1 = new ArrayList<>(); list1.add(new Student("李麻子",23)); System.out.println(Stream.concat(list.stream(), list1.stream()).count()); } }运行结果如下:
获取此流运算后的最大值或者最小值元素。但是对于自定义的类型,默认的 max() 方法是不能获取此流的最大值元素,默认的 min() 方法是不能获取此流的最小值元素,会报异常,此时就需要用到比较器了。
通过代码具体实现:
import java.util.ArrayList; import java.util.List; public class StreamIntermediateMethod { public static void main(String[] args) { Listlist = new ArrayList<>(); list.add(new Student("张三", 19)); list.add(new Student("李四", 22)); list.add(new Student("王五", 17)); list.add(new Student("张麻子", 33)); Student s1 = list.stream().max((o1, o2) -> o1.getAge() - o2.getAge()).get(); System.out.println("最大年龄为:"+s1.getAge()); Student s2 = list.stream().min((o1, o2) -> o1.getAge() - o2.getAge()).get(); System.out.println("最小年龄为:"+s2.getAge()); } }运行结果如下:
把流处理后的结果收集到一个指定的集合中去。
通过代码具体实现:
一. 收集到 list 系列集合中
import java.util.stream.Collectors; import java.util.ArrayList; import java.util.List; public class StreamIntermediateMethod { public static void main(String[] args) { Listlist = new ArrayList<>(); list.add(new Student("张三", 19)); list.add(new Student("李四", 22)); list.add(new Student("王五", 17)); list.add(new Student("张麻子", 33)); //对以下代码进行解读:先得到该集合的流,再筛选开头为“张”的名字,得到一个新流,再收集到 List 系列集合中。 Listlist1 = list.stream().filter(s->s.getName().startsWith("张")).collect(Collectors.toList()); System.out.println(list1); } }运行结果如下:
二.收集到 Set 系列集合中
import java.util.*; import java.util.stream.Collectors; public class StreamIntermediateMethod { public static void main(String[] args) { Listlist = new ArrayList<>(); list.add(new Student("张三", 19)); list.add(new Student("李四", 22)); list.add(new Student("王五", 17)); list.add(new Student("张麻子", 33)); //对一下代码进行解读: 先得到该集合的流,再进行筛选出年龄大于18的元素, // 最后再将这些集合中的元素收集到 Set 系列集合中。 Setset = list.stream().filter(s->s.getAge() > 18).collect(Collectors.toSet()); System.out.println(set); } }运行结果如下:
三.收集到 Map 系列集合中
import java.util.*; import java.util.stream.Collectors; public class StreamIntermediateMethod { public static void main(String[] args) { Listlist = new ArrayList<>(); list.add(new Student("张三", 19)); list.add(new Student("李四", 22)); list.add(new Student("王五", 17)); list.add(new Student("张麻子", 33)); Mapmap = list.stream().collect(Collectors.toMap(s-> s.getName(), s-> s.getAge())); System.out.println(map); } }运行结果如下:
四.收集到数组中
import java.util.*; public class StreamIntermediateMethod { public static void main(String[] args) { Listlist = new ArrayList<>(); list.add(new Student("张三", 19)); list.add(new Student("李四", 22)); list.add(new Student("王五", 17)); list.add(new Student("张麻子", 33)); Student[] students = list.stream().toArray(s->new Student[s]); //以上代码简化为如下: Student[] students1 = list.stream().toArray(Student[]::new); System.out.println(Arrays.toString(students)); System.out.println(Arrays.toString(students1)); } }运行结果如下:
本篇就先讲到这里!!!点击以下链接有更多篇目:小扳_-CSDN博客