在jdk1.8新的stream包中针对集合的操作也提供了并行操作流和串行操作流。并行流就是把内容切割成多个数据块,并且使用多个线程分别处理每个数据块的内容。
优点:
Stream API可以极大提高Java程序员的生产力,让程序员写出高效率、干净、简洁的代码。
以前对集合遍历都是通过Iterator或者For-Each的方式,显式的在集合外部进行迭代,这叫做外部迭代。Stream提供了内部迭代的方式,通过访问者模式(Visitor)实现。
1.实体类
package com.money.pojo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Person {
private String name;
private String sex;
private int age;
private String province;
private String city;
}
2. Steam流操作
package com.money.service;
import com.money.pojo.Person;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
public class StreamDemo {
public static void main(String[] args) {
// 添加集合
List<Person> personList = new ArrayList<>();
personList.add(new Person("王安石","man",24,"江西","抚州"));
personList.add(new Person("黄庭坚","man",25,"江西","九江"));
personList.add(new Person("程长文","woman",22,"江西","上饶"));
personList.add(new Person("文天祥","man",25,"江西","吉安"));
personList.add(new Person("欧阳修","man",24,"江西","吉安"));
personList.add(new Person("顾恺之","man",28,"江苏","无锡"));
personList.add(new Person("李煜","man",29,"江苏","徐州"));
personList.add(new Person(" 刘邦","man",28,"江苏","徐州"));
personList.add(new Person("赵飞燕","woman",21,"江苏","苏州"));
personList.add(new Person("周恩来","man",24,"江苏","淮安"));
// 过滤
List<Person> list1 = personList.stream().filter(p -> p.getProvince().equals("江苏")).collect(Collectors.toList());
System.out.println("list1 = " + list1);
// 映射
List<String> list2 = personList.stream().map(Person::getName).collect(Collectors.toList());
System.out.println("list2 = " + list2);
// 分部,按照性别
Map<Boolean, List<Person>> listMap = personList.stream().collect(Collectors.partitioningBy(person -> person.getSex().equals("woman")));
System.out.println("listMap = " + listMap);
// 分组, 按照省份和城市
Map<String, Map<String, List<Person>>> cityMap = personList.stream().collect(Collectors.groupingBy(Person::getProvince, Collectors.groupingBy(Person::getCity)));
System.out.println("cityMap = " + cityMap);
// 平均值
Map<String, Map<String, Double>> avgAgeMap = personList.stream().collect(Collectors.groupingBy(Person::getProvince, Collectors.groupingBy(Person::getCity, Collectors.averagingInt(Person::getAge))));
System.out.println("avgAgeMap = " + avgAgeMap);
// 排序
Map<String, List<Person>> ageSort = personList.stream().collect(Collectors.groupingBy(Person::getSex, Collectors.collectingAndThen(Collectors.toList(), s -> {
s.sort(Comparator.comparing(Person::getAge));
return s;
})));
System.out.println("ageSort = " + ageSort);
}
}
3.实现效果
过滤出江苏省:
list1 = [Person(name=顾恺之, sex=man, age=28, province=江苏, city=无锡), Person(name=李煜, sex=man, age=29, province=江苏, city=徐州), Person(name= 刘邦, sex=man, age=28, province=江苏, city=徐州), Person(name=赵飞燕, sex=woman, age=21, province=江苏, city=苏州), Person(name=周恩来, sex=man, age=24, province=江苏, city=淮安)]
映射姓名:
list2 = [王安石, 黄庭坚, 程长文, 文天祥, 欧阳修, 顾恺之, 李煜, 刘邦, 赵飞燕, 周恩来]按照性别分部:
listMap = {false=[Person(name=王安石, sex=man, age=24, province=江西, city=抚州), Person(name=黄庭坚, sex=man, age=25, province=江西, city=九江), Person(name=文天祥, sex=man, age=25, province=江西, city=吉安), Person(name=欧阳修, sex=man, age=24, province=江西, city=吉安), Person(name=顾恺之, sex=man, age=28, province=江苏, city=无锡), Person(name=李煜, sex=man, age=29, province=江苏, city=徐州), Person(name= 刘邦, sex=man, age=28, province=江苏, city=徐州), Person(name=周恩来, sex=man, age=24, province=江苏, city=淮安)], true=[Person(name=程长文, sex=woman, age=22, province=江西, city=上饶), Person(name=赵飞燕, sex=woman, age=21, province=江苏, city=苏州)]}按照省份和城市分组:
cityMap = {江苏={徐州=[Person(name=李煜, sex=man, age=29, province=江苏, city=徐州), Person(name= 刘邦, sex=man, age=28, province=江苏, city=徐州)], 淮安=[Person(name=周恩来, sex=man, age=24, province=江苏, city=淮安)], 无锡=[Person(name=顾恺之, sex=man, age=28, province=江苏, city=无锡)], 苏州=[Person(name=赵飞燕, sex=woman, age=21, province=江苏, city=苏州)]}, 江西={上饶=[Person(name=程长文, sex=woman, age=22, province=江西, city=上饶)], 抚州=[Person(name=王安石, sex=man, age=24, province=江西, city=抚州)], 吉安=[Person(name=文天祥, sex=man, age=25, province=江西, city=吉安), Person(name=欧阳修, sex=man, age=24, province=江西, city=吉安)], 九江=[Person(name=黄庭坚, sex=man, age=25, province=江西, city=九江)]}}按照城市求年龄平均值:
avgAgeMap = {江苏={徐州=28.5, 淮安=24.0, 无锡=28.0, 苏州=21.0}, 江西={上饶=22.0, 抚州=24.0, 吉安=24.5, 九江=25.0}}按照性别分组后再按年龄排序:
ageSort = {woman=[Person(name=赵飞燕, sex=woman, age=21, province=江苏, city=苏州), Person(name=程长文, sex=woman, age=22, province=江西, city=上饶)], man=[Person(name=王安石, sex=man, age=24, province=江西, city=抚州), Person(name=欧阳修, sex=man, age=24, province=江西, city=吉安), Person(name=周恩来, sex=man, age=24, province=江苏, city=淮安), Person(name=黄庭坚, sex=man, age=25, province=江西, city=九江), Person(name=文天祥, sex=man, age=25, province=江西, city=吉安), Person(name=顾恺之, sex=man, age=28, province=江苏, city=无锡), Person(name= 刘邦, sex=man, age=28, province=江苏, city=徐州), Person(name=李煜, sex=man, age=29, province=江苏, city=徐州)]}