0%

java-Day17——StreamAPI

StreamAPI

  • Stream API关注的是多个数据的计算(排序、查找、过滤、映射、遍历等,面向CPU。集合关注的数据的存储,向下内存的。
  • Stream API之于集合,类似于SQL之于数据表的查询。

使用说明

  • Stream不会存储元素
  • Stream不会改变源对象。相反,他们会返回一个持有结果的新Stream
  • Stream是延迟执行的。这意味着他们会等到需要结果的时候才执行。即一旦执行终止操作,就执行中间操作链,并产生结果
  • Stream一旦执行了终止操作,就不能再调用其它中间操作或终止操作

Stream执行流程

  1. Stream的实例化
  2. 一系列的中间操作
  3. 执行终止操作

实例化:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
//创建Stream方式一:通过集合
@Test
public void test1(){
List<Employee> list = EmployeeData.getEmployees();
// default Stream<E> stream():返回一个顺序流
Stream<Employee> stream = list.stream();
// default Stream<E> parallelStream():返回一个并行流
Stream<Employee> stream1= list.parallelStream();
}

//创建Stream方式二:通过数组
@Test
public void test2(){
//通过调用Arrays的static<T> Stream<T> stream(T[] array):返回一个流
Integer[] arr = new Integer[]{1,2,3,4,5};
Stream<Integer> stream = Arrays.stream(arr);

int[] arr1 = new int[]{1,2,3,4,5};
IntStream stream1 = Arrays.stream(arr1);

}

//创建Stream方式三:通过Stream的of()
@Test
public void test3(){
Stream<String> stream = Stream.of("Aa", "bb", "cc");
}

中间操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
//1.筛选与切片
@Test
public void test1(){
//filter(Predicate p)--接受Lambda,从流中排除某些元素
//ex.查询员工表中薪资大于7000的员工信息
List<Employee> list = EmployeeData.getEmployees();
Stream<Employee> stream = list.stream();
stream.filter(emp -> emp.getSalary()>7000).forEach(System.out::println);

//limit(n) --截断流,使其元素不超过给定数量
list.stream().limit(4).forEach(System.out::println);
//skip(n) -- 跳过元素。返回一个扔掉前n个元素的流
list.stream().skip(5).forEach(System.out::println);
//distinct() --筛选,通过流所生成元素的hashCode()和equals()去除重复元素
list.stream().distinct().forEach(System.out::println);
}

//2.映射
@Test
public void test2(){
//map(Function f)接受一个函数作为参数,将元素转化成其他形式或提取信息,该函数会应用到每个元素
List<String> list = Arrays.aslist("aa","bb","cc","dd");
list.stream().map(str -> str.toUpperCase()).forEach(System.out::println);

//Ex:获取员工姓名大于3的员工
List<Employee> employees = EmployeeData.getEmployees();
employees.stream().filter(emp->emp.getName().length()>3).forEach(System.out::println);

//Ex.获取员工姓名长度大于3的员工的姓名
List<Employee> employees = EmployeeData.getEmployees();
employees.stream().filter(emp->emp.getName().length()>3).map(emp->emp.getName()).forEach(System.out::println);
}
//3.排序
@Test
public void test3(){
//sorted()- 自然排序
Integer[] arr = new Integer[]{12,3,4,5,6,23,45,1};
String[] arr1 = new String[]{"GG","DD","FF","SS","JJ"};
Arrays.stream(arr).sorted().forEach(System.out::println);

//sorted(Comparator com) - 定制排序
List<Employee> list = EmployeeData.getEmployees();
list.stream().sorted((e1,e2)-> e1.getAge() - e2.getAge()).forEach(System.out::println);

}

终止操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
public class StreamAPITest3 {
//1-匹配与查找
@Test
public void test1(){
List<Employee> list = EmployeeData.getEmployees();

//allMatch(Predicate p) -检测是否匹配所有元素
System.out.println(list.stream().allMatch(emp->emp.getAge()>18));
//anyMatch(Predicate p)-检查是否至少匹配一个元素
System.out.println(list.stream().anyMatch(emp->emp.getAge()>18));
//findFirst-返回第一个元素
System.out.println(list.stream().findFirst(emp->emp.getAge()>18));
//Count-返回流中元素的总个数
System.out.println(list.stream().filter(emp->emp.getSalary()>7000).count());
//max(Comparator c)-返回流中最大值
list.stream().max((e1,e2)-> Double.compare(e1.getSalary(), e2.getSalary()));
//min(Comparator c)-返回流中最大值
//forEach(Consumer c)-内部迭代
list.stream().forEach(System.out::println);
}

//2-归约
@Test
public void test3(){
//reduce(T identity, BinaryOperator)-可以将流中元素反复结合起来,得到一个值
List<Integer> list = Arrays.asList(1,2,3,4,5,6,7);
list.stream().reduce(0,(x1,x2)->x1+x2);

//reduce(BinaryOperator)
//ex.计算公司所有员工工资总和
list<Employee> employeeList = EmployeeData.getEmployees();
System.out.println(employeeList.stream().map(employee->employee.geSalary()).reduce((salary1,salary2)->Double.sum(salary1,salary2)));
System.out.println(employeeList.stream().map(employee->employee.geSalary()).reduce(Double::sum);

}
//3.收集
@Test
public void test4(){
//collect(Collector c)-将流转换位其他形式。接受一个Collector接口的实现,用于给Stream中元素做汇总方法
//ex1:查找工资大于6000的员工,返回一个List
List<Employee> list = EmployeeData.getEmployees();
List<Employee> list1 = list.stream().filter(emp-> emp.getSalary()>6000).collect(Collectors.toList());
list1.forEach(System.out::println);
//ex2:员工年龄排序
List<Employee> list2 = list.stream().sorted((e1,e2)->e1.getAge()-e2.getAge()).collect(Collectors.toList());
list2.forEach(System.out::println);
}
}
-------------本文结束感谢您的阅读-------------