jdk8引入了强大了stream API极大了简化了代码,下面我们来看看常用的api以及作用
user类
public class User {
private String name;
private Integer age;
private Double salary;
private Status status;
public enum Status{
BUSY,
FREE;
}
public User() {
}
public User(String name, Integer age, Double salary, Status status) {
this.name = name;
this.age = age;
this.salary = salary;
this.status = status;
}
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", age=" + age +
", salary=" + salary +
", status=" + status +
'}';
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer 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 boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
User user = (User) o;
return Objects.equals(name, user.name) && Objects.equals(age, user.age) && Objects.equals(salary, user.salary) && status == user.status;
}
@Override
public int hashCode() {
return Objects.hash(name, age, salary, status);
}
}
测试list
List<User> userList = Arrays.asList(new User("张三",23,6666d, User.Status.BUSY),
new User("李四",18,7777d, User.Status.BUSY),
new User("王五",26,5670D, User.Status.BUSY),
new User("王二",45,0d, User.Status.FREE),
new User("麻子",23,0d, User.Status.FREE),
new User("麻子",23,0d, User.Status.FREE));
1.filter()----选出符合条件的元素
选出符合条件的元素,例如选出年龄大于24的用户
List<User> userList1 = userList.stream().filter(e -> e.getAge() > 24).collect(Collectors.toList());
2.distinct()----去重,通过流生成的元素的hashCode()和equals()方法去除重复元素
List<User> userList1 = userList.stream().distinct().collect(Collectors.toList());
3.limit()----使元素不超过给定的数量,skip()----跳过指定的元素个数,两个配合使用可以用来做复杂的分页,具体可以看jdk多数据源分页
4.sorted()----自然排序
//根据年龄从大到小排序
List<User> userList1 = userList.stream().sorted((e1, e2) -> {
return -e1.getAge().compareTo(e2.getAge());
}).collect(Collectors.toList());
5allMatch()----检查是否匹配所以元素
//检查是否所有的用户都繁忙
boolean b = userList.stream().allMatch(e -> e.getStatus().equals(User.Status.BUSY));
6.anyMatch()----是否至少匹配一个元素
//检查当前是否有员工空闲
boolean b = userList.stream().anyMatch(e -> e.getStatus().equals(User.Status.FREE));
7.findFirst()----返回第一个元素
//查找工资最高的一个用户的信息,现根据工资从高到低排序,然后找出第一个元素
User user = userList.stream().sorted((e1,e2) -> -e1.getSalary().compareTo(e2.getSalary())).findFirst().get();
8.findAny()----返回当前流中的任意一个元素
//返回当前空闲用户中的任何一个分配任务
User user = userList.stream().filter(e -> e.getStatus().equals(User.Status.FREE)).findAny().get();
9.reduce()----可以将流中元素反复结合起来,得到一个值
//得到当前所有用户的工资总和
Double aDouble = userList.stream().map(User::getSalary).reduce(Double::sum).get();
10.collect—将流转换成其他形式,接受一个Collector接口的实现,用于给stream中元素做汇总
//从当前所有用户中取出姓名作为一个List<String>
List<String> stringList = userList.stream().map(User::getName).collect(Collectors.toList());
//分组,根据空闲或者繁忙分组
Map<User.Status, List<User>> collect = userList.stream().collect(Collectors.groupingBy(User::getStatus));
//将名字链接为一个字符串,以","隔开
String str = userList.stream().map(User::getName).collect(Collectors.joining(","));
另外,还有两个集合之间的操作,并集、差集等
List<String> list1 = new ArrayList<String>();
list1.add("1");
list1.add("2");
list1.add("3");
list1.add("5");
list1.add("6");
List<String> list2 = new ArrayList<String>();
list2.add("2");
list2.add("3");
list2.add("7");
list2.add("8");
// 交集 2,3
List<String> intersection = list1.stream().filter(item -> list2.contains(item)).collect(toList());
System.out.println("---交集 intersection---");
intersection.parallelStream().forEach(System.out :: println);
// 差集 (list1 - list2)
List<String> reduce1 = list1.stream().filter(item -> !list2.contains(item)).collect(toList());
System.out.println("---差集 reduce1 (list1 - list2)---");
reduce1.parallelStream().forEach(System.out :: println);
// 差集 (list2 - list1)
List<String> reduce2 = list2.stream().filter(item -> !list1.contains(item)).collect(toList());
System.out.println("---差集 reduce2 (list2 - list1)---");
reduce2.parallelStream().forEach(System.out :: println);
// 并集 123562378
List<String> listAll = list1.parallelStream().collect(toList());
List<String> listAll2 = list2.parallelStream().collect(toList());
listAll.addAll(listAll2);
System.out.println("---并集 listAll---");
listAll.parallelStream().forEachOrdered(System.out :: println);
// 去重并集 1235678
List<String> listAllDistinct = listAll.stream().distinct().collect(toList());
System.out.println("---得到去重并集 listAllDistinct---");
listAllDistinct.parallelStream().forEachOrdered(System.out :: println);
System.out.println("---原来的List1---");
list1.parallelStream().forEachOrdered(System.out :: println);
System.out.println("---原来的List2---");
list2.parallelStream().forEachOrdered(System.out :: println);