对于java8中的stream,由于工作中不常使用,所以很容易忘记。但一旦有相应场景,使用起来很方便,在这里记录一下我使用过的常用流。
我对流操作的感受:流操作可以类比我们的sql语句,用流可以实现where、group by等。
实体类:
class Person{
private String name;
private int age;
private String province;
private String city;
public Person(String name, int age, String province, String city) {
this.name = name;
this.age = age;
this.province = province;
this.city = city;
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
// 节约博客空间,省略getter、setter、toString
}
group by
private void groupBy(){
List<Person> personList = new ArrayList<>();
Person person1 = new Person("张三",13,"吉林","长春");
Person person2 = new Person("陈二",12,"吉林","四平");
Person person3 = new Person("李四",14,"辽宁","沈阳");
personList.add(person1);
personList.add(person2);
personList.add(person3);
Map collect = personList.stream().collect(Collectors.groupingBy(Person::getProvince, Collectors.groupingBy(Person::getCity)));
System.out.println(collect);
}
结果:
{吉林={四平=[Person{name='陈二', age=12, province='吉林', city='四平'}], 长春=[Person{name='张三', age=13, province='吉林', city='长春'}]}, 辽宁={沈阳=[Person{name='李四', age=14, province='辽宁', city='沈阳'}]}}
指定group by结果集,一个group by:
private void groupBy(){
List<Person> personList = new ArrayList<>();
Person person1 = new Person("张三",13,"吉林","长春");
Person person2 = new Person("张五",13,"吉林","长春");
Person person3 = new Person("陈二",12,"吉林","四平");
Person person4 = new Person("李四",14,"辽宁","沈阳");
personList.add(person1);
personList.add(person2);
personList.add(person3);
personList.add(person4);
Map<String,List<Person>> collect = personList.stream().collect(Collectors.groupingBy(Person::getProvince/*, Collectors.groupingBy(Person::getCity)*/));
System.out.println(collect);
}
指定group by结果集,两个group by:
private void groupBy(){
List<Person> personList = new ArrayList<>();
Person person1 = new Person("张三",13,"吉林","长春");
Person person2 = new Person("张五",13,"吉林","长春");
Person person3 = new Person("陈二",12,"吉林","四平");
Person person4 = new Person("李四",14,"辽宁","沈阳");
personList.add(person1);
personList.add(person2);
personList.add(person3);
personList.add(person4);
Map<String,Map<String,List<Person>>> collect = personList.stream().collect(Collectors.groupingBy(Person::getProvince, Collectors.groupingBy(Person::getCity)));
System.out.println(collect);
}
filter
使用stream().filter()来过滤一个List对象,查找符合条件的对象集合。
下面示例的等效SQL:age>13 AND province=‘吉林’
private void filter(){
List<Person> personList = new ArrayList<>();
Person person1 = new Person("张三",12,"吉林","长春");
Person person2 = new Person("陈二",14,"吉林","四平");
Person person3 = new Person("陈五",15,"吉林","松原");
Person person4 = new Person("李四",16,"辽宁","沈阳");
personList.add(person1);
personList.add(person2);
personList.add(person3);
personList.add(person4);
List<Person> collect = personList.stream().filter(person -> person.getAge() > 13 && person.getProvince().equals("吉林")).collect(Collectors.toList());
System.out.println(collect);
}
结果:
[Person{name='陈二', age=14, province='吉林', city='四平'}, Person{name='陈五', age=15, province='吉林', city='松原'}]
sort
public void sort(){
List<Person> personList = new ArrayList<>();
Person person1 = new Person("张三",13);
Person person2 = new Person("陈二",9);
Person person3 = new Person("李四",14);
personList.add(person1);
personList.add(person2);
personList.add(person3);
// 按照年龄排序,默认升序
List<Person> collect = personList.stream().sorted(Comparator.comparing(Person::getAge)).collect(Collectors.toList());
System.out.println(collect);
}
NOT IN
需求:两个集合,一个大集合,一个小集合,集合的元素类是一个,要求从大集合中去掉小集合
private void test(){
Test test1 = new Test("1","Bob1",121);
Test test2 = new Test("2","Bob2",122);
Test test3 = new Test("3","Bob3",123);
Test test4 = new Test("4","Bob4",124);
Test test5 = new Test("5","Bob5",125);
List<Test> all = new ArrayList<>();
all.add(test1);
all.add(test2);
all.add(test3);
all.add(test4);
all.add(test5);
List<Test> child = new ArrayList<>();
child.add(test2);
child.add(test3);
all.removeIf(item->{
return child.stream().anyMatch(childItem ->{
// 如果子集合的id和全集的id相同,就从全集内去掉该元素
return childItem.getId().equals(item.getId());
});
});
System.out.println(all);
}
class Test{
private String id;
private String name;
private Integer age;
// 省略了构造方法和getter setter
}