一、demo准备
实体类Employee
package dto;
import lombok.Data;
@Data
public class Employee {
private Integer id;
private String name;
private Integer age;
private Double weight;
public Employee(Integer id,String name, Integer age, Double weight) {
this.id=id;
this.name = name;
this.age = age;
this.weight = weight;
}
public Employee() {
}
}
service层
MyFunction普通接口
package service;
public interface MyFunction {
public String getValue(String str);
}
MyPredicate带泛型的接口
package service;
public interface MyPredicate<T> {
/**
* 对传递过来的T类型的数据进行过滤
* 符合规则返回true,不符合规则返回false
*/
boolean filter(T t);
}
两个实现类impl:
1.比较年龄
package service.impl;
import dto.Employee;
import service.MyPredicate;
public class FilterEmployeeByAge implements MyPredicate<Employee>{
public boolean filter(Employee employee) {
return employee.getAge()>18;
}
}
2.比较体重
package service.impl;
import dto.Employee;
import service.MyPredicate;
public class FilterEmployeeByWeight implements MyPredicate<Employee>{
public boolean filter(Employee employee) {
return employee.getWeight()>50;
}
}
二、测试类tast
package tast;
import dto.Employee;
import service.MyPredicate;
import service.impl.FilterEmployeeByAge;
import service.impl.FilterEmployeeByWeight;
import service.MyFunction;
import java.util.*;
import java.util.stream.Collectors;
public class Test {
protected List<Employee> arrayList =(List<Employee>) Arrays.asList(
new Employee(1,"张三", 16, 99.99D),
new Employee(2,"李四", 38, 55.55D),
new Employee(4,"田七", 18, 49.33D),
new Employee(3,"王五", 60, 66.66D),
new Employee(5,"赵六", 16, 77.77D),
new Employee(6,"",19,50D),
new Employee(7,"孙悟空",99,99999.0D),
new Employee(7,"齐天大圣",99,99999.0D)
);
/*
* 优化方案1
* */
public List<Employee> filterEmployee(List<Employee> list, MyPredicate<Employee> myPredicate){
List<Employee> employees = new ArrayList<Employee>();
for(Employee e : list){
if(myPredicate.filter(e)){
employees.add(e);
}
}
return employees;
}
@org.junit.Test
public void test1() {
ArrayList<Employee> employees=new ArrayList<Employee>();
for (Employee employee:arrayList) {
if(employee.getAge()>18){
employees.add(employee);
}
}
System.out.println("年龄大于18的:"+employees);
employees=new ArrayList<Employee>();
for (Employee employee:arrayList) {
if(employee.getWeight()>50){
employees.add(employee);
}
}
System.out.println("体重大于50的:"+employees);
List<Employee> employeeList = this.filterEmployee(arrayList, new FilterEmployeeByAge());
System.out.println("年龄大于18的:");
for (Employee employee:employeeList) {
System.out.println(employee);
}
System.out.println("体重大于50的:");
employeeList=this.filterEmployee(arrayList,new FilterEmployeeByWeight());
for (Employee employee:employeeList) {
System.out.println(employee);
}
}
/*
*
* 方案2使用内部类
* */
@org.junit.Test
public void test2(){
List<Employee> employees = this.filterEmployee(arrayList, new MyPredicate<Employee>() {
public boolean filter(Employee employee) {
return employee.getAge() > 18;
}
});
for (Employee employee:employees) {
System.out.println(employee);
}
}
/*
* 方案3使用Lambda
* */
@org.junit.Test
public void test3(){
filterEmployee(arrayList,(e)->e.getAge()>18).forEach(System.out::println);
}
/*
* 方案4使用Stream API
* limit
* */
@org.junit.Test
public void test4(){
arrayList.stream().filter(employee -> employee.getAge()>18).forEach(System.out::println);
//限制几名
arrayList.stream().filter(employee -> employee.getWeight()>50).limit(2).forEach(System.out::println);
}
/*
* 拿取实体类的个别属性
*
* */
@org.junit.Test
public void test5(){
arrayList.stream().filter(employee -> employee.getAge() > 18).map(Employee::getName).forEach(System.out::println);
arrayList.stream().filter(employee -> employee.getWeight()>50).map(Employee::getName).forEach(System.out::append);
}
/*
* 先比较年龄,如果年龄相同再比较姓名
* */
@org.junit.Test
public void test6(){
Collections.sort(
arrayList,(e1,e2)->{
if(e1.getAge()==e2.getAge()){
return e1.getName().compareTo(e2.getName());
}
return Integer.compare(e1.getAge(),e2.getAge());
//如果想实现倒叙的排序,直接在Integer前加-
//return -Integer.compare(e1.getAge(),e2.getAge());
}
);
arrayList.stream().forEach(System.out::println);
}
public String stringHander(String str, MyFunction myFunction){
return myFunction.getValue(str);
}
/*
* 大小写,截取
* */
@org.junit.Test
public void test7(){
String str = stringHander("wuchengen", e -> e.toUpperCase());
System.out.println(str);
String subStr = stringHander("wuchengen", e -> e.substring(0,5));
System.out.println(subStr);
}
/*
* 排序
* */
@org.junit.Test
public void test8(){
List<Employee> employees = arrayList.stream().sorted(Comparator.comparing(Employee::getAge)).collect(Collectors.toList());
employees.stream().forEach(System.out::println);
}
/*
* 字符串返回结果
* */
@org.junit.Test
public void test9(){
String str = arrayList.stream().filter(employee -> employee.getAge() > 18).map(Employee::getName).collect(Collectors.joining(","));
System.out.println(str);
}
/*
*聚合函数的应用
* */
@org.junit.Test
public void test10(){
long count = arrayList.stream().filter(employee -> employee.getName().isEmpty()).count();
IntSummaryStatistics intSummaryStatistics = arrayList.stream().mapToInt(Employee::getAge).summaryStatistics();
int max = intSummaryStatistics.getMax();
int min = intSummaryStatistics.getMin();
long sum = intSummaryStatistics.getSum();
double average = intSummaryStatistics.getAverage();
System.out.println("姓名为空的人数:"+count);
System.out.println("最大的年龄:"+max);
System.out.println("最小的年龄:"+min);
System.out.println("年龄和:"+sum);
System.out.println("平均年龄:"+average);
List<Employee> employees = arrayList.stream().filter(employee -> employee.getAge() == min).collect(Collectors.toList());
System.out.println("最小年龄的员工信息"+employees);
}
/*
* 其中map有三种构造方法的重载:
* 正常的key-value结构
* toMap(Function<? super T, ? extends K> keyMapper, Function<? super T, ? extends U> valueMapper);
* key存在冲突时,解决方案
* toMap(Function<? super T, ? extends K> keyMapper, Function<? super T, ? extends U> valueMapper,BinaryOperator<U> mergeFunction);
* 第四个参数是排序的方式
* toMap(Function<? super T, ? extends K> keyMapper, Function<? super T, ? extends U> valueMapper,BinaryOperator<U> mergeFunction, Supplier<M> mapSupplier);
* */
@org.junit.Test
public void test11(){
//得到姓名中包含"三"的人的姓名和员工号
Map<Integer, String> map = arrayList.stream().filter(employee -> employee.getName().contains("三")).collect(Collectors.toMap(Employee::getId, Employee::getName));
System.out.println(map);
//若key存在冲突那么,可以调用tomap的第二个重载方式
Map<Integer, String> map2 = arrayList.stream().collect(Collectors.toMap(Employee::getId, Employee::getName, (n, m) -> n +","+m));
System.out.println(map2);
//tomap四个参数,第四个参数是排序方式
Map<Integer, String> map3 = arrayList.stream().collect(Collectors.toMap(Employee::getId, Employee::getName, (n, m) -> n +","+m,TreeMap::new));
System.out.println(map3);
}
}
三、输出测试结果
- 优化方案1
年龄大于18的:[Employee(id=2, name=李四, age=38, weight=55.55), Employee(id=3, name=王五, age=60, weight=66.66), Employee(id=6, name=, age=19, weight=50.0), Employee(id=7, name=孙悟空, age=99, weight=99999.0), Employee(id=7, name=齐天大圣, age=99, weight=99999.0)]
体重大于50的:[Employee(id=1, name=张三, age=16, weight=99.99), Employee(id=2, name=李四, age=38, weight=55.55), Employee(id=3, name=王五, age=60, weight=66.66), Employee(id=5, name=赵六, age=16, weight=77.77), Employee(id=7, name=孙悟空, age=99, weight=99999.0), Employee(id=7, name=齐天大圣, age=99, weight=99999.0)]
年龄大于18的:
Employee(id=2, name=李四, age=38, weight=55.55)
Employee(id=3, name=王五, age=60, weight=66.66)
Employee(id=6, name=, age=19, weight=50.0)
Employee(id=7, name=孙悟空, age=99, weight=99999.0)
Employee(id=7, name=齐天大圣, age=99, weight=99999.0)
体重大于50的:
Employee(id=1, name=张三, age=16, weight=99.99)
Employee(id=2, name=李四, age=38, weight=55.55)
Employee(id=3, name=王五, age=60, weight=66.66)
Employee(id=5, name=赵六, age=16, weight=77.77)
Employee(id=7, name=孙悟空, age=99, weight=99999.0)
Employee(id=7, name=齐天大圣, age=99, weight=99999.0)
- 方案2使用内部类
Employee(id=2, name=李四, age=38, weight=55.55)
Employee(id=3, name=王五, age=60, weight=66.66)
Employee(id=6, name=, age=19, weight=50.0)
Employee(id=7, name=孙悟空, age=99, weight=99999.0)
Employee(id=7, name=齐天大圣, age=99, weight=99999.0)
- 方案3使用Lambda
Employee(id=2, name=李四, age=38, weight=55.55)
Employee(id=3, name=王五, age=60, weight=66.66)
Employee(id=6, name=, age=19, weight=50.0)
Employee(id=7, name=孙悟空, age=99, weight=99999.0)
Employee(id=7, name=齐天大圣, age=99, weight=99999.0)
- 方案4使用Stream API
Employee(id=2, name=李四, age=38, weight=55.55)
Employee(id=3, name=王五, age=60, weight=66.66)
Employee(id=6, name=, age=19, weight=50.0)
Employee(id=7, name=孙悟空, age=99, weight=99999.0)
Employee(id=7, name=齐天大圣, age=99, weight=99999.0)
Employee(id=1, name=张三, age=16, weight=99.99)
Employee(id=2, name=李四, age=38, weight=55.55)
- 拿取实体类的个别属性
李四
王五
孙悟空
齐天大圣
张三李四王五赵六孙悟空齐天大圣
- 先比较年龄,如果年龄相同再比较姓名
Employee(id=1, name=张三, age=16, weight=99.99)
Employee(id=5, name=赵六, age=16, weight=77.77)
Employee(id=4, name=田七, age=18, weight=49.33)
Employee(id=6, name=, age=19, weight=50.0)
Employee(id=2, name=李四, age=38, weight=55.55)
Employee(id=3, name=王五, age=60, weight=66.66)
Employee(id=7, name=孙悟空, age=99, weight=99999.0)
Employee(id=7, name=齐天大圣, age=99, weight=99999.0)
- 大小写,截取
WUCHENGEN
wuche
- 排序按照年龄排序的)
Employee(id=1, name=张三, age=16, weight=99.99)
Employee(id=5, name=赵六, age=16, weight=77.77)
Employee(id=4, name=田七, age=18, weight=49.33)
Employee(id=6, name=, age=19, weight=50.0)
Employee(id=2, name=李四, age=38, weight=55.55)
Employee(id=3, name=王五, age=60, weight=66.66)
Employee(id=7, name=孙悟空, age=99, weight=99999.0)
Employee(id=7, name=齐天大圣, age=99, weight=99999.0)
- 字符串返回结果
李四,王五,孙悟空,齐天大圣
- 聚合函数的应用
姓名为空的人数:1
最大的年龄:99
最小的年龄:16
年龄和:365
平均年龄:45.625
最小年龄的员工信息
[Employee(id=1, name=张三, age=16, weight=99.99), Employee(id=5, name=赵六, age=16, weight=77.77)]
- 其中map有三种构造方法的重载
{1=张三}
{1=张三, 2=李四, 3=王五, 4=田七, 5=赵六, 6=, 7=孙悟空,齐天大圣}
{1=张三, 2=李四, 3=王五, 4=田七, 5=赵六, 6=, 7=孙悟空,齐天大圣}