Stream流的使用方法
Stream流
1.Stream流的创建
| Collection提供的如下方法 | 说明 |
|---|---|
| default Stream |
获取当前集合对象的stream流 |
| Arrays类提供的如下方法 | |
| public static |
获取当前数组的stream流 |
| Stream类提供的如下方法 | |
| public static |
获取当前接收数据的stream流 |
演示
public class StreamDemo2 {
public static void main(String[] args) {
// 目标:获取Stream流的方式。
// 1、获取集合的Stream流:调用集合提供的stream()方法
Collection<String> list = new ArrayList<>();
Stream<String> s1 = list.stream();
// 2、Map集合,怎么拿Stream流。
Map<String, Integer> map = new HashMap<>();
// 获取键流
Stream<String> s2 = map.keySet().stream();
// 获取值流
Stream<Integer> s3 = map.values().stream();
// 获取键值对流
Stream<Map.Entry<String, Integer>> s4 = map.entrySet().stream();
// 3、获取数组的流。
String[] names = {"张三丰", "张无忌", "张翠山", "张良", "张学友"};
Stream<String> s5 = Arrays.stream(names);
System.out.println(s5.count()); // 5
Stream<String> s6 = Stream.of(names);
Stream<String> s7 = Stream.of("张三丰", "张无忌", "张翠山", "张良", "张学友");
}
}
2.Stream流中间方法
| Stream提供的常用中间方法 | 说明 |
|---|---|
| Stream |
用于对流中的数据进行过滤。 |
| Stream |
对元素进行升序排序 |
| Stream |
按照指定规则排序 |
| Stream |
获取前几个元素 |
| Stream |
跳过前几个元素 |
| Stream |
去除流中重复的元素。 |
| 对元素进行加工,并返回对应的新流 | |
| static |
合并a和b两个流为一个流 |
演示
public class StreamDemo3 {
public static void main(String[] args) {
// 目标:掌握Stream提供的常用的中间方法,对流上的数据进行处理(返回新流:支持链式编程)
List<String> list = new ArrayList<>();
list.add("张无忌");
list.add("周芷若");
list.add("赵敏");
list.add("张强");
list.add("张三丰");
list.add("张翠山");
// 1、过滤方法
list.stream().filter(s -> s.startsWith("张") && s.length() == 3).forEach(System.out::println);
// 2、排序方法。
List<Double> scores = new ArrayList<>();
scores.add(88.6);
scores.add(66.6);
scores.add(66.6);
scores.add(77.6);
scores.add(77.6);
scores.add(99.6);
scores.stream().sorted().forEach(System.out::println); // 默认是升序。
System.out.println("--------------------------------------------------");
scores.stream().sorted((s1, s2) -> Double.compare(s2, s1)).forEach(System.out::println); // 降序
System.out.println("--------------------------------------------------");
scores.stream().sorted((s1, s2) -> Double.compare(s2, s1)).limit(2).forEach(System.out::println); // 只要前2名
System.out.println("--------------------------------------------------");
scores.stream().sorted((s1, s2) -> Double.compare(s2, s1)).skip(2).forEach(System.out::println); // 跳过前2名
System.out.println("--------------------------------------------------");
// 如果希望自定义对象能够去重复,重写对象的hashCode和equals方法,才可以去重复!
scores.stream().sorted((s1, s2) -> Double.compare(s2, s1)).distinct().forEach(System.out::println); // 去重复
// 映射/加工方法: 把流上原来的数据拿出来变成新数据又放到流上去。
scores.stream().map(s -> "加10分后:" + (s + 10)).forEach(System.out::println);
// 合并流:
Stream<String> s1 = Stream.of("张三丰", "张无忌", "张翠山", "张良", "张学友");
Stream<Integer> s2 = Stream.of(111, 22, 33, 44);
Stream<Object> s3 = Stream.concat(s1, s2);
System.out.println(s3.count());
}
}
3.Stream流终结方法
| Stream提供的常用终结方法 | 说明 |
|---|---|
| void forEach(Consumer action) | 对此流运算后的元素执行遍历 |
| long count() | 统计此流运算后的元素个数 |
| Optional |
获取此流运算后的最大值元素 |
| Optional |
获取此流运算后的最小值元素 |
| R collect(Collector collector) | 把流处理后的结果收集到一个指定的集合中去 |
| Object[] toArray() | 把流处理后的结果收集到一个数组中去 |
演示
public class StreamDemo4 {
public static void main(String[] args) {
// 目标:掌握Stream流的统计,收集操作(终结方法)
List<Teacher> teachers = new ArrayList<>();
teachers.add(new Teacher("张三", 23, 5000));
teachers.add(new Teacher("金毛狮王", 54, 16000));
teachers.add(new Teacher("李四", 24, 6000));
teachers.add(new Teacher("王五", 25, 7000));
teachers.add(new Teacher("白眉鹰王", 66, 108000));
teachers.add(new Teacher("陈昆", 42, 48000));
teachers.stream().filter(t -> t.getSalary() > 15000).forEach(System.out::println);
System.out.println("--------------------------------------------------");
long count = teachers.stream().filter(t -> t.getSalary() > 15000).count();
System.out.println(count);
System.out.println("--------------------------------------------------");
// 获取薪水最高的老师对象
Optional<Teacher> max = teachers.stream().max((t1, t2) -> Double.compare(t1.getSalary(), t2.getSalary()));
Teacher maxTeacher = max.get(); // 获取Optional对象中的元素
System.out.println(maxTeacher);
Optional<Teacher> min = teachers.stream().min((t1, t2) -> Double.compare(t1.getSalary(), t2.getSalary()));
Teacher minTeacher = min.get(); // 获取Optional对象中的元素
System.out.println(minTeacher);
System.out.println("---------------------------------------------------------");
List<String> list = new ArrayList<>();
list.add("张无忌");
list.add("周芷若");
list.add("赵敏");
list.add("张强");
list.add("张三丰");
list.add("张三丰");
list.add("张翠山");
// 流只能收集一次
// 收集到集合或者数组中去。
Stream<String> s1 = list.stream().filter(s -> s.startsWith("张"));
// 收集到List集合
List<String> list1 = s1.collect(Collectors.toList());
System.out.println(list1);
//Set<String> set2 = new HashSet<>();
//set2.addAll(list1);
// 收集到Set集合
Stream<String> s2 = list.stream().filter(s -> s.startsWith("张"));
Set<String> set = s2.collect(Collectors.toSet());
System.out.println(set);
// 收集到数组中去
Stream<String> s3 = list.stream().filter(s -> s.startsWith("张"));
Object[] array = s3.toArray();
System.out.println("数组:" + Arrays.toString(array));
System.out.println("------------------收集到Map集合---------------------------");
// 收集到Map集合:键是老师名称,值是老师薪水
Map<String, Double> map = teachers.stream().collect(Collectors.toMap(Teacher::getName, Teacher::getSalary));
System.out.println(map);
}
}
4.收集Stream流
| Stream提供的常用终结方法 | 说明 |
|---|---|
| R collect(Collector collector) | 把流处理后的结果收集到一个指定的集合中去 |
| Object[] toArray() | 把流处理后的结果收集到一个数组中去 |
| Collectors工具类提供了具体的收集方式 | |
| public static |
把元素收集到List集合中 |
| public static |
把元素收集到Set集合中 |
| public static Collector toMap(Function keyMapper ,Function valueMapper) | 把元素收集到Map集合中 |
演示
public class Demo12StreamFinalMethod {
public static void main(String[] args) {
List<Teacher> ts = new ArrayList<>();
ts.add(new Teacher(1, "Jack", 20));
ts.add(new Teacher(2, "Jackson", 18));
ts.add(new Teacher(3, "XiaoLi", 28));
ts.add(new Teacher(4, "XiaoHua", 23));
long count = ts.stream().count();
System.out.println("count = " + count);
System.out.println("------------------------");
Optional<Teacher> max = ts.stream().max((o1, o2) -> o1.getAge() - o2.getAge());
Teacher maxTeacher = max.get();
System.out.println(maxTeacher);
System.out.println("------------------------");
Optional<Teacher> min = ts.stream().min((o1, o2) -> o1.getAge() - o2.getAge());
Teacher minTeacher = min.get();
System.out.println(minTeacher);
System.out.println("------------------------");
//收集新集合
List<Teacher> list = ts.stream().collect(Collectors.toList());
System.out.println(list);
Set<Teacher> set = ts.stream().collect(Collectors.toSet());
System.out.println(set);
//Teacher::getId
//Map<Object, Object> map = ts.stream().collect(Collectors.toMap(teacher -> teacher.getId(), teacher -> teacher));
//修改写法
Map<Object, Object> map = ts.stream().collect(Collectors.toMap(Teacher::getId, v -> v));
System.out.println(map);
//收集数组
Teacher[] array = ts.stream().toArray(value -> new Teacher[list.size()]);
System.out.println(array);
}
}
浙公网安备 33010602011771号