java 8 新特性之Stream的排序/分類
阿新 • • 發佈:2018-12-10
Stream簡介
Stream是Java8提供的一個新的API,它位於java.util.stream包下。Stream API提供了一種新的方式來對Java集合進行操作,這種操作方式極大的提高了Java程式設計師的生產力,讓程式設計師寫出高效率、乾淨、簡潔的程式碼。
我們可以將元素集合看作一種流, 流在管道中傳輸, 並且可以在管道的節點上進行處理, 比如篩選, 排序,聚合等。元素流在管道中經過中間操作的處理,最後由最終操作得到前面處理的結果
Stream方法
- 示例程式碼
class Employee {
private Long empno; //員工號 private String ename; //員工姓名 private Integer salary; //薪水 private Integer deptno; //所屬部門號 //此處省略get/set方法、構造方法以及toString方法 } Employee e1 = new Employee(7369L, "SMITH", 800, 20); Employee e2 = new Employee(7499L, "ALLEN", 1600, 30); Employee e3 = new Employee(7521L, "WARD", 1250, 30); Employee e4 = new Employee(7782L, "CLARK", 2450, 10); Employee e5 = new Employee(7876L, "ADAMS", 1100, 20); List<Employee> employees = Arrays.asList(e1, e2, e3, e4, e5);
- forEach方法
forEach方法用於迭代stream流中的每一個元素
employees.stream().forEach(System.out::println);
執行結果:
Employee{empno=7369, ename='SMITH', salary=800, deptno=20}
Employee{empno=7499, ename='ALLEN', salary=1600, deptno=30} Employee{empno=7521, ename='WARD', salary=1250, deptno=30} Employee{empno=7782, ename='CLARK', salary=2450, deptno=10} Employee{empno=7876, ename='ADAMS', salary=1100, deptno=20}
- map方法
map方法用於根據自定義的規則對stream流中的資料做一對一的對映
//獲取所有員工的姓名
List<String> enames = employees.stream().map(employee -> employee.getEname()).collect(Collectors.toList());
enames.stream().forEach(System.out::println);
執行結果:
SMITH
ALLEN
WARD
CLARK
ADAMS
- mapToInt/mapToLong/mapToDouble方法
這幾個方法主要用來對stream流中的元素產生單個的統計結果
//獲取所有員工的薪水總和
int totalSalary = employees.stream().mapToInt(employee -> employee.getSalary()).sum();
System.out.println("薪水總和:" + totalSalary);
執行結果:
薪水總和:7200
- filter方法
filter方法用於根據設定的條件對stream流中的資料做過濾操作
//獲取薪水超過1500的員工
List<Employee> filterEmp = employees.stream().filter(employee -> employee.getSalary()>1500).collect(Collectors.toList());
filterEmp.stream().forEach(System.out::println);
執行結果:
Employee{empno=7499, ename='ALLEN', salary=1600, deptno=30}
Employee{empno=7782, ename='CLARK', salary=2450, deptno=10}
- sorted方法
sorted方法用於對流中的元素進行排序
//按員工的薪水由低到高排序
List<Employee> sortedEmp = employees.stream().sorted(Comparator.comparing(Employee::getSalary)).collect(Collectors.toList());
sortedEmp.stream().forEach(System.out::println);
執行結果:
Employee{empno=7369, ename='SMITH', salary=800, deptno=20}
Employee{empno=7876, ename='ADAMS', salary=1100, deptno=20} Employee{empno=7521, ename='WARD', salary=1250, deptno=30} Employee{empno=7499, ename='ALLEN', salary=1600, deptno=30} Employee{empno=7782, ename='CLARK', salary=2450, deptno=10}
- Collectors類
Collectors 類實現了很多歸約操作,例如將流轉換成集合和聚合元素。Collectors 可用於返回列表或字串
//按員工所屬部門號進行分類
Map<Integer, List<Employee>> map = employees.stream().collect(Collectors.groupingBy(employee -> employee.getDeptno()));
for(Map.Entry<Integer, List<Employee>> entry : map.entrySet()) {
System.out.println("key: " + entry.getKey() + " value:" + entry.getValue()); } System.out.println(); //獲取員工姓名,用","進行拼接 String enameString = employees.stream().map(employee -> employee.getEname()).collect(Collectors.joining(",")); System.out.println(enameString);
執行結果:
key: 20 value:[Employee{empno=7369, ename='SMITH', salary=800, deptno=20}, Employee{empno=7876, ename='ADAMS', salary=1100, deptno=20}] key: 10 value:[Employee{empno=7782, ename='CLARK', salary=2450, deptno=10}] key: 30 value:[Employee{empno=7499, ename='ALLEN', salary=1600, deptno=30}, Employee{empno=7521, ename='WARD', salary=1250, deptno=30}] SMITH,ALLEN,WARD,CLARK,ADAMS
- 方法串聯
Stream API提供的多個方法可以在一行程式碼中同時串聯使用
//獲取20號部門員工姓名,按薪水從高到低排序
List<String> names = employees.stream().filter(employee -> employee.getDeptno().equals(20)).sorted(Comparator.comparing(Employee::getSalary).reversed()).map(employee -> employee.getEname()).collect(Collectors.toList());
names.stream().forEach(System.out::println);
執行結果:
ADAMS
SMITH
- 總結
Stream API提供了多個方法對集合進行對映、過濾、排序等操作,相比於Java7,大大簡化了程式碼的開發。記住:Stream API中的方法並不會影響原始集合