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 }