Stream流

1. stream的概述

 

 

 1 import java.util.ArrayList;
 2 import java.util.Collections;
 3 import java.util.List;
 4 
 5 public class demo {
 6     public static void main(String[] args) {
 7         List<String> names = new ArrayList<>();
 8 
 9         Collections.addAll(names, "张三", "张无忌", "张三丰", "郭靖");
10         System.out.println(names);
11 
12         // 1. 从集合中找出姓张的放到集合
13 
14         List<String> zhangName = new ArrayList<>();
15 
16         for (String name : names) {
17             if (name.startsWith("张")) {
18                 zhangName.add(name);
19             }
20         }
21         System.out.println(zhangName);
22 
23         // 2. 找名称长度是3的姓名
24         List<String> zhangThreeName = new ArrayList<>();
25 
26         for (String s : zhangName) {
27             if (s.length() == 3) {
28                 zhangThreeName.add(s);
29             }
30         }
31         System.out.println(zhangThreeName);
32 
33         System.out.println("-----------------------------------------------");
34 
35         // 3. 使用Stream实现, forEach简化
36         names.stream().filter(s -> s.startsWith("张")).filter( s -> s.length() == 3).forEach(System.out::println);
37 
38     }
39 }

 

 

 

 

2. stream流的获取

 

 

 

 

 

 

 

 

 

 

 

 1 import java.util.*;
 2 import java.util.stream.Stream;
 3 
 4 public class demo2 {
 5     public static void main(String[] args) {
 6 
 7         // 1. Collection集合获取流
 8         Collection<String> list = new ArrayList<>();
 9         Stream<String> listStream = list.stream();
10 
11         // 2. map集合获取流
12         HashMap<String, Integer> maps = new HashMap<>();
13 
14         //键流
15         Stream<String> streamMap = maps.keySet().stream();
16         //值流
17         Stream<Integer> streamValues = maps.values().stream();
18         //键值对流(拿整体)
19         Stream<Map.Entry<String, Integer>> streamKV = maps.entrySet().stream();
20 
21         // 3. 数组获取流
22         String[] names = {"张三", "王麻子", "李四"};
23         Stream<String> streamNames = Arrays.stream(names);
24 
25     }
26 }

 

 

3. stream流的常用方法

(1)Stream流的常用API(中间操作方法)

 

注意:

  中间方法也称为非终结方法,调用完成后返回新的Stream流可以继续使用,支持链式编程。

  在Stream流中无法直接修改集合、数组中的数据。

 

(2)Stream流的常见终结操作方法

 

 

 注意:终结操作方法,调用完成后流就无法继续使用了,原因是不会返回Stream了。

 

 

3. Stream流的综合应用

 1 /**
 2  * 需求:某个公司的开发部门,分为开发一部和二部,现在需要进行年中数据结算。
 3  * 分析:
 4  * :员工信息至少包含了(名称、性别、工资、奖金、处罚记录)
 5  * :开发一部有4个员工、开发二部有5名员工
 6  * :分别筛选出2个部门的最高工资的员工信息,封装成优秀员工对象Topperformer
 7  * :分别统计出2个部门的平均月收入,要求去掉最高和最低工资。
 8  * :统计2个开发部门整体的平均工资,去掉最低和最高工资的平均值。
 9  */
10 public class Employee {
11     private String name;
12     private char sex;
13     private double salary;
14     private double bonus;
15     private String punish;
16 
17     public Employee() {
18     }
19 
20     public Employee(String name, char sex, double salary, double bonus, String punish) {
21         this.name = name;
22         this.sex = sex;
23         this.salary = salary;
24         this.bonus = bonus;
25         this.punish = punish;
26     }
27 
28     public String getName() {
29         return name;
30     }
31 
32     public void setName(String name) {
33         this.name = name;
34     }
35 
36     public char getSex() {
37         return sex;
38     }
39 
40     public void setSex(char sex) {
41         this.sex = sex;
42     }
43 
44     public double getSalary() {
45         return salary;
46     }
47 
48     public void setSalary(double salary) {
49         this.salary = salary;
50     }
51 
52     public double getBonus() {
53         return bonus;
54     }
55 
56     public void setBonus(double bonus) {
57         this.bonus = bonus;
58     }
59 
60     public String getPunish() {
61         return punish;
62     }
63 
64     public void setPunish(String punish) {
65         this.punish = punish;
66     }
67 
68     @Override
69     public String toString() {
70         return "Employee{" +
71                 "name='" + name + '\'' +
72                 ", sex=" + sex +
73                 ", salary=" + salary +
74                 ", bonus=" + bonus +
75                 ", punish='" + punish + '\'' +
76                 '}';
77     }
78 }
 1 /**
 2  * 封装优秀员工
 3  */
 4 public class Topperformer {
 5     private String name;
 6     private double money;
 7 
 8     public Topperformer() {
 9     }
10 
11     public Topperformer(String name, double money) {
12         this.name = name;
13         this.money = money;
14     }
15 
16     public String getName() {
17         return name;
18     }
19 
20     public void setName(String name) {
21         this.name = name;
22     }
23 
24     public double getMoney() {
25         return money;
26     }
27 
28     public void setMoney(double money) {
29         this.money = money;
30     }
31 
32     @Override
33     public String toString() {
34         return "Topperformer{" +
35                 "name='" + name + '\'' +
36                 ", money=" + money +
37                 '}';
38     }
39 }
 1 import java.util.ArrayList;
 2 import java.util.List;
 3 
 4 public class employeeTest {
 5 
 6     private static double allMoney;
 7 
 8     public static void main(String[] args) {
 9         List<Employee> one = new ArrayList<>();
10         one.add(new Employee("猪八戒", '男', 20000, 23000, null));
11         one.add(new Employee("孙悟空", '男', 30000, 33000, "大闹天宫"));
12         one.add(new Employee("沙僧", '男', 18000, 13000, null));
13         one.add(new Employee("唐僧", '男', 40000, 40000, null));
14 
15         List<Employee> two = new ArrayList<>();
16         two.add(new Employee("武松", '男', 30000, 20000, null));
17         two.add(new Employee("李逵", '男', 20000, 10000, null));
18         two.add(new Employee("西门庆", '男', 10000, 10000, "偷别人老婆"));
19         two.add(new Employee("武大郎", '男', 30000, 20000, null));
20         two.add(new Employee("林冲", '男', 30000, 10000, null));
21 
22         // 1. one中的最高工资员工
23         // 指定大小规则
24         //Employee e = one.stream().max((e1, e2) -> Double.compare(e1.getSalary() + e1.getBonus(), e2.getSalary() + e2.getBonus())).get()
25         Topperformer t = one.stream().max((e1, e2) -> Double.compare(e1.getSalary() + e1.getBonus(), e2.getSalary() + e2.getBonus()))
26                 .map(e -> new Topperformer(e.getName(), e.getSalary() + e.getBonus())).get();
27         System.out.println(t);
28 
29         // 2. 去掉最高和最低工资, stream流没有求平均的
30         one.stream().sorted((e1, e2) -> Double.compare(e1.getSalary() + e1.getBonus(), e2.getSalary() + e2.getBonus()))
31                 .skip(1).limit(one.size() - 2).forEach(e -> {
32                     // 求出总和,剩余员工的工资总和
33             allMoney += e.getSalary() + e.getBonus();
34                 });
35 
36         System.out.println("one的平均工资: " + allMoney / (one.size() - 2));
37 
38     }
39 }

 

 

 

4. 收集Stream流

收集Stream流的含义:就是把Stream流操作后的结果数据转回到集合或者数组中去。

Stream流:方便操作集合/数组的手段。

集合/数组:才是开发中的目的。

流只能使用一次。

 

(1)Stream流的收集方法

 

 

(2)Collectors工具类提供了具体的收集方式

 

 

 1 import java.util.ArrayList;
 2 import java.util.List;
 3 import java.util.stream.Collectors;
 4 import java.util.stream.Stream;
 5 
 6 /**
 7  * 收集Stream流的数据到集合或者数据中去
 8  */
 9 public class demo4 {
10     public static void main(String[] args) {
11         List<String> list = new ArrayList<>();
12         list.add("wl");
13         list.add("phx");
14 
15         Stream<String> s = list.stream();
16         // 收集
17         List<String> collect = s.collect(Collectors.toList());
18         System.out.println(collect);
19     }
20 }

 

 

(3)收集Stream的作用

Stream流是操作集合/数组的手段

操作的结果数据最终要恢复到集合或者数组中去。

 1 import java.util.ArrayList;
 2 import java.util.List;
 3 import java.util.stream.Collectors;
 4 import java.util.stream.Stream;
 5 
 6 /**
 7  * 收集Stream流的数据到集合或者数据中去
 8  */
 9 public class demo4 {
10     public static void main(String[] args) {
11         List<String> list = new ArrayList<>();
12         list.add("wl");
13         list.add("phx");
14 
15         Stream<String> s = list.stream();
16         // 收集
17         List<String> collect = s.collect(Collectors.toList());
18         System.out.println(collect);
19     }
20 }

 

posted @ 2022-08-09 14:27  小王同学学编程  阅读(78)  评论(0编辑  收藏  举报
levels of contents