1. Stream流概述
Stream流的作用是简化集合、数组操作的API。结合了Lambda表达式。
Stream流式思想的核心
- 先得到集合或者数组的Stream流(就是一根传送带)
- 把元素放上去
- 然后就用这个Stream流简化的API来方便的操作元素
2. Stream流的获取
2.1 Stream流的三类方法
- 获取Stream流:创建一条流水线,并把数据放到流水线上准备进行操作
- 中间方法:流水线上的操作。一次操作完毕之后,还可以继续进行其他操作
- 终结流:一个Stream流只能有一个终结方法,是流水线上的最后一个操作
2.2 获取Stream流的方式
2.2.1集合获取Stream流的方式
- 可以使用Collection接口中的默认方法stream()生成流
2.2.2数组获取Stream流的方式
public class StreamDemo02 {
public static void main(String[] args) {
/** --------------------Collection集合获取流------------------------------- */
Collection<String> list = new ArrayList<>();
Stream<String> s = list.stream();
/** --------------------Map集合获取流------------------------------- */
Map<String, Integer> maps = new HashMap<>();
// 键流
Stream<String> keyStream = maps.keySet().stream();
// 值流
Stream<Integer> valueStream = maps.values().stream();
// 键值对流(整体)
Stream<Map.Entry<String, Integer>> keyAndValueStream = maps.entrySet().stream();
/** ---------------------数组获取流------------------------------ */
String[] names = {"赵敏","小昭","灭绝","周芷若"};
Stream<String> nameStream = Arrays.stream(names);
Stream<String> nameStream2 = Stream.of(names);
}
}
3. Stream流的常用API
3.1 Stream流的常用中间操作方法
- 中间方法也称为非终结方法,调用完成后返回新的Stream流可以继续使用,支持链式编程。
- 在Stream流中无法直接修改集合、数组中的数据。
3.2 Stream流的常用终结操作方法
- 终结操作方法,调用完成后流就无法继续使用了,原因是不会返回Stream了。
4. Stream流的综合应用
public class StreamDemo04 {
public static double allMoney;
public static double allMoney2; // 2个部门去掉最高工资,最低工资的总和
public static void main(String[] args) {
List<Employee> one = new ArrayList<>();
one.add(new Employee("猪八戒",'男',30000 , 25000, null));
one.add(new Employee("孙悟空",'男',25000 , 1000, "顶撞上司"));
one.add(new Employee("沙僧",'男',20000 , 20000, null));
one.add(new Employee("小白龙",'男',20000 , 25000, null));
List<Employee> two = new ArrayList<>();
two.add(new Employee("武松",'男',15000 , 9000, null));
two.add(new Employee("李逵",'男',20000 , 10000, null));
two.add(new Employee("西门庆",'男',50000 , 100000, "被打"));
two.add(new Employee("潘金莲",'女',3500 , 1000, "被打"));
two.add(new Employee("武大郎",'女',20000 , 0, "下毒"));
// 2、开发1部的最高工资的员工
// 制定大小规则
// Employee e = one.stream().max((e1, e2) -> Double.compare(e1.getSalary() + e1.getBones(), e2.getSalary() + e2.getBones()))
// .get();
// System.out.println(e);
Topperformer t = one.stream().max((e1, e2) -> Double.compare(e1.getSalary() + e1.getBones(), e2.getSalary() + e2.getBones()))
.map(e -> new Topperformer(e.getName(), e.getSalary() + e.getBones())).get();
System.out.println(t);
// 2、统计平均工资,去掉最高工资和最低工资
one.stream().sorted((e1, e2) -> Double.compare(e1.getSalary() + e1.getBones(), e2.getSalary() + e2.getBones()))
.skip(1).limit(one.size() - 2).forEach(e -> {
// 求出总和:剩余员工的工资总和
allMoney += (e.getSalary() + e.getBones());
});
System.out.println("开发一部的平均工资是:" + allMoney / (one.size() - 2));
// 3、合并两个集合流,再统计
Stream<Employee> s1 = one.stream();
Stream<Employee> s2 = two.stream();
Stream<Employee> s3 = Stream.concat(s1, s2);
s3.sorted((e1, e2) -> Double.compare(e1.getSalary() + e1.getBones(), e2.getSalary() + e2.getBones()))
.skip(1).limit(one.size() + two.size() - 2).forEach(e -> {
// 求出总和:剩余员工的工资总和
allMoney2 += (e.getSalary() + e.getBones());
});
// BigDecimal
BigDecimal a = BigDecimal.valueOf(allMoney2);
BigDecimal b = BigDecimal.valueOf(one.size() + two.size() - 2);
System.out.println("开发部的平均工资是:" + a.divide(b, 2, RoundingMode.HALF_UP));
}
}
5. 收集Stream流
- 就是把Stream流操作后的结果数据转回到集合或者数组中去。
- Stream:方便操作集合/数组的手段。
- 集合/数组:才是开发中的目的。
public class StreamDemo05 {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("张无忌");
list.add("周芷若");
list.add("赵敏");
list.add("张强");
list.add("张三丰");
list.add("张三丰");
Stream<String> s1 = list.stream().filter(s -> s.startsWith("张"));
List<String> zhangList = s1.collect(Collectors.toList());// 可变集合
zhangList.add("Java");
System.out.println(zhangList);
// List<String> list1 = s1.toList();// 得到不可变集合
// list1.add("java");
// System.out.println(list1);
// 注意注意注意:"流只能使用一次"
Stream<String> s2 = list.stream().filter(s -> s.startsWith("张"));
Set<String> zhangSet = s2.collect(Collectors.toSet());
System.out.println(zhangSet);
Stream<String> s3 = list.stream().filter(s -> s.startsWith("张"));
//Object[] arrs = s3.toArray();
String[] arrs = s3.toArray(String[]::new);// 可以不管,拓展一下思维
System.out.println("Arrays数组内容:" + Arrays.toString(arrs));
}
}