Java8中Stream的歸約與收集
阿新 • • 發佈:2019-05-07
cati false 多級分組 其他 ring tis object () etc Java8中Stream的歸約與收集
歸約
reduce(T identity, BinaryOperator) / reduce(BinaryOperator) --可以將流中元素反復結合起來,得到一個值
public class Employee { private String name; private Integer age; private Double salary; private Status status; public Employee() { super(); } public Employee(Integer age){ this.age = age; } public Employee(String name, Integer age, Double salary) { super(); this.name = name; this.age = age; this.salary = salary; } public Employee(String name, Integer age, Double salary, Status status) { this.name = name; this.age = age; this.salary = salary; this.status = status; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(Integer age) { this.age = age; } public double getSalary() { return salary; } public void setSalary(Double salary) { this.salary = salary; } public Status getStatus() { return status; } public void setStatus(Status status) { this.status = status; } @Override public String toString() { return "Employee{" + "name=‘" + name + ‘\‘‘ + ", age=" + age + ", salary=" + salary + ", status=" + status + ‘}‘; } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Employee employee = (Employee) o; return age == employee.age && Double.compare(employee.salary, salary) == 0 && Objects.equals(name, employee.name); } @Override public int hashCode() { return Objects.hash(name, age, salary); } public enum Status{ FREE, BUSY, VOCATION; } }
//歸約 @Test public void test1(){ List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); Integer sum = list.stream() .reduce(0, (x, y) -> x + y); System.out.println(sum);//首先把0作為x,然後從流中取出一個元素作為y,然後把運算結果作為x,再取出下一個元素作為y System.out.println("--------------------------------------"); Optional<Double> op = employees.stream() .map(Employee::getSalary) .reduce(Double::sum); System.out.println(op.get()); }
收集
collect---將流轉換為其他形式。接收一個Collector接口的實現,用於給Stream中元素做匯總的方法
//收集 @Test public void test2(){ List<String> list = employees.stream() .map(Employee::getName) .collect(Collectors.toList()); list.forEach(System.out::println); System.out.println("--------------------------------"); Set<String> set = employees.stream() .map(Employee::getName) .collect(Collectors.toSet()); set.forEach(System.out::println); System.out.println("---------------------------------"); HashSet<String> hs = employees.stream() .map(Employee::getName) .collect(Collectors.toCollection(HashSet::new)); hs.forEach(System.out::println); } @Test public void test3(){ //總數 Long count = employees.stream() .collect(Collectors.counting()); System.out.println(count); System.out.println("-------------------------------"); //平均值 Double avg = employees.stream() .collect(Collectors.averagingDouble(Employee::getSalary)); System.out.println(avg); System.out.println("--------------------------------"); //總和 Double sum = employees.stream() .collect(Collectors.summingDouble(Employee::getSalary)); System.out.println(sum); System.out.println("---------------------------------"); //最大值 Optional<Employee> max = employees.stream() .collect(Collectors.maxBy((e1, e2) -> Double.compare(e1.getSalary(), e2.getSalary()))); System.out.println(max.get()); System.out.println("---------------------------------"); //最小值 Optional<Double> min = employees.stream() .map(Employee::getSalary) .collect(Collectors.minBy(Double::compare)); System.out.println(min.get()); } //分組 @Test public void test4(){ Map<Employee.Status, List<Employee>> map = employees.stream() .collect(Collectors.groupingBy(Employee::getStatus)); System.out.println(map); } //多級分組 @Test public void test5(){ Map<Employee.Status, Map<String, List<Employee>>> map = employees.stream() .collect(Collectors.groupingBy(Employee::getStatus, Collectors.groupingBy((e) -> { if (((Employee) e).getAge() <= 35) { return "青年"; } else if (((Employee) e).getAge() <= 50) { return "中年"; } else { return "老年"; } }))); System.out.println(map); } //分區 @Test public void test6(){ Map<Boolean, List<Employee>> map = employees.stream() .collect(Collectors.partitioningBy((e) -> e.getSalary() > 8000)); System.out.println(map); } @Test public void test7(){ DoubleSummaryStatistics dss = employees.stream() .collect(Collectors.summarizingDouble(Employee::getSalary)); System.out.println(dss.getSum()); System.out.println(dss.getAverage()); System.out.println(dss.getMax()); } @Test public void test8(){ String str = employees.stream() .map(Employee::getName) .collect(Collectors.joining(",", "開始", "結束")); System.out.println(str); }
Java8中Stream的歸約與收集