最近换了公司,翻了别人的代码,发现用了很多代码。Stream,而且用法多样,深入研究,发现掌握这一点很熟练api,它在提高开发效率和简化代码方面发挥着巨大的作用,因此结合一些案例进行总结。
案例:
1、Bean属性去重
一个List中,有多个bean,如何根据一个或多个属性进行重复
User user1 = User.builder().name("sdf").sex("男").point("12").build(); User user2 = User.builder().name("sdf").sex("男").point("45").build(); User user3 = User.builder().name("sdf1").sex("男").point("78").build(); User user4 = User.builder().name("sdf1").sex("女").point("67").build(); User user5 = User.builder().name("sdf1").sex("女").point("90").build(); List<User> list = List.of(user1, user2, user3, user4, user5); List<User> newList = list.stream().collect( Collectors.collectingAndThen(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(distinctKeyByFunction()), ArrayList::new)); System.out.println(list); System.out.println(newList); //根据user的name和sex来去重 public static Function<User, String> distinctKeyByFunction() { return (User user) -> user.getName() user.getSex(); } 返回结果: [User(name=sdf, sex=男, point=12), User(name=sdf, sex=男, point=45), User(name=sdf1, sex=男, point=78), User(name=sdf1, sex=女, point=67), User(name=sdf1, sex=女, point=90)] [User(name=sdf1, sex=女, point=67), User(name=sdf1, sex=男, point=78), User(name=sdf, sex=男, point=12)]
2、排序
一个List,如何根据一个属性或多个属性进行排序
User user1 = User.builder().name("sdf").sex("男").point("12").build(); User user2 = User.builder().name("edf").sex("男").point("45").build(); User user3 = User.builder().name("jku").sex("男").point("78").build(); User user4 = User.builder().name("lio").sex("女").point("67").build(); User user5 = User.builder().name("oiu").sex("女").point("90").build(); User user6 = User.builder().name("oiu").sex("女").point("80").build(); List<User> list = List.of(user1, user2, user3, user4, user5, user6); //先根据name的倒序,再根据point顺序排序 List<User> sortedList = list.stream().sorted(Comparator.comparing(User::getName).reversed().thenComparing(User::getPoint)).collect(Collectors.toList()); System.out.println(sortedList);
三、排序并取前几个
一个List,根据point排名前三名
User user1 = User.builder().name("sdf").sex("男").point("12").build(); User user2 = User.builder().name("edf").sex("男").point("45").build(); User user3 = User.builder().name("jku").sex("男").point("78").build(); User user4 = User.builder().name("lio").sex("女").point("67").build(); User user5 = User.builder().name("oiu").sex("女").point("90").build(); User user6 = User.builder().name("oiu").sex("女").point("80").build(); User user7 = User.builder().name("oiu").sex("女").point("80").build(); List<User> list = List.of(user1, user2, user3, user4, user5, user6, user7); List<User> userList = list.stream().sorted(Comparator.comparing(User::getPoint)).limit(3).collect(Collectors.toList()); System.out.println(userList); ======================返回结果=============== [User(name=sdf, sex=男, point=12), User(name=edf, sex=男, point=45), User(name=lio, sex=女, point=67)]
4.排名第四和第五
一个List,根据point排序,取第四、五、六名
User user1 = User.builder().name("sdf").sex("男").point("12").build(); User user2 = User.builder().name("edf").sex("男").point("45").build(); User user3 = User.builder().name("jku").sex("男").point("78").build(); User user4 = User.builder().name("lio").sex("女").point("67").build(); User user5 = User.builder().name("oiu").sex("女").point("90").build(); User user6 = User.builder().name("oiu").sex("女").point("80").build(); User user7 = User.builder().name("oiu").sex("女").point("80").build(); List<User> list = List.of(user1, user2, user3, user4, user5, user6, user7); List<User> userList = list.stream().sorted(Comparator.comparing(User::getPoint)).skip(3).limit(3).collect(Collectors.toList()); System.out.println(userList); ==============================返回结果============================ [User(name=jku, sex=男, point=78), User(name=oiu, sex=女, point=80), User(name=oiu, sex=女, point=80)]
5、去重
一个List,如果有重复的对象,就会去重,比较对象的方法,用 equals若类重写equals,则可以对bean进行去重
User user1 = User.builder().name("sdf").sex("男").point("12").build(); User user2 = User.builder().name("sdf").sex("男").point("45").build(); User user3 = User.builder().name("sdf1").sex("男").point("78").build(); User user4 = User.builder().name("sdf1").sex("女").pont("67").build();
User user5 = User.builder().name("sdf1").sex("女").point("90").build();
List<User> list = List.of(user1, user2, user3, user4, user5);
List<String> nameList1 = list.stream().map(item -> item.getName()).distinct().collect(Collectors.toList());
System.out.println(nameList1);
6、过滤
一个list,根据条件进行过滤,返回满足条件的列表
User user1 = User.builder().name("sdf").sex("男").point("12").build();
User user2 = User.builder().name("sdf").sex("男").point("45").build();
User user3 = User.builder().name("xdf1").sex("男").point("78").build();
User user4 = User.builder().name("pdf1").sex("女").point("67").build();
User user5 = User.builder().name("sdf1").sex("女").point("90").build();
List<User> list = List.of(user1, user2, user3, user4, user5);
List<User> userList = list.stream().filter(item -> item.getName().startsWith("sd") && Integer.parseInt(item.getPoint()) > 40).collect(Collectors.toList());
System.out.println(userList);
结果如下:
[User(name=sdf, sex=男, point=45), User(name=sdf1, sex=女, point=90)]
7、返回指定的列表
一个list,返回指定内容的list
User user1 = User.builder().name("sdf").sex("男").point("12").build();
User user2 = User.builder().name("sdf").sex("男").point("45").build();
User user3 = User.builder().name("xdf1").sex("男").point("78").build();
User user4 = User.builder().name("pdf1").sex("女").point("67").build();
User user5 = User.builder().name("sdf1").sex("女").point("90").build();
List<User> list = List.of(user1, user2, user3, user4, user5);
List<String> nameList = list.stream().map(User::getName).collect(Collectors.toList());
List<NewUser> newUserList = list.stream().map(
item -> {
NewUser newUser = new NewUser();
newUser.setSex(item.getSex());
newUser.setName(item.getName());
return newUser;
}
).collect(Collectors.toList());
返回结果:
[sdf, sdf, xdf1, pdf1, sdf1]
[NewUser(name=sdf, sex=男), NewUser(name=sdf, sex=男), NewUser(name=xdf1, sex=男), NewUser(name=pdf1, sex=女), NewUser(name=sdf1, sex=女)]
8、List转Map
一个list,取指定属性,转化成map,并对key重复的情况进行处理
User user1 = User.builder().name("sdf").sex("男").point("12").build();
User user2 = User.builder().name("sdf").sex("男").point("45").build();
User user3 = User.builder().name("xdf1").sex("男").point("78").build();
User user4 = User.builder().name("pdf1").sex("女").point("67").build();
User user5 = User.builder().name("sdf1").sex("女").point("90").build();
List<User> list = List.of(user1, user2, user3, user4, user5);
Map<String, String> namePointMap = list.stream().collect(Collectors.toMap(User::getName, User::getPoint, (k1, k2) -> {
if (Integer.parseInt(k1) > Integer.parseInt(k2)) {
return k1;
} else {
return k2;
}
}));
System.out.println(namePointMap);
==============
返回结果:
{sdf=45, sdf1=90, pdf1=67, xdf1=78}
9、处理Bean属性的值
某一个bean中存在属性的值为数字,对这些数据进行处理(统计,求平均等)
//求和
long newPointCount = list.stream().collect(Collectors.summarizingInt(User::getNewPoint)).getSum();
//求最大和最小
int max = list.stream().collect(Collectors.summarizingInt(User::getNewPoint)).getMax();
int min = list.stream().collect(Collectors.summarizingInt(User::getNewPoint)).getMin();
//求平均值
double average = list.stream().collect(Collectors.summarizingInt(User::getNewPoint)).getAverage();
//计算总数
long count = list.stream().collect(Collectors.summarizingInt(User::getNewPoint)).getCount();
======================多个列表存在多个值,对这些值进行处理==================
IntSummaryStatistics summaryStatistics = new IntSummaryStatistics(5,0,100,100);
IntSummaryStatistics statistics = list.stream().collect(Collectors.summarizingInt(User::getNewPoint));
System.out.println(statistics);
statistics.combine(summaryStatistics);
System.out.println(statistics);
-----------结果---------------------------
IntSummaryStatistics{count=5, sum=61, min=1, average=12.200000, max=31}
IntSummaryStatistics{count=10, sum=161, min=0, average=16.100000, max=100}
10、分组、分组并计算数量
User user1 = User.builder().name("sdf").sex("男").point("12").math(2).english(45).build();
User user2 = User.builder().name("sdf").sex("男").point("45").math(1).english(50).build();
User user3 = User.builder().name("xdf1").sex("男").point("78").math(31).english(59).build();
User user4 = User.builder().name("pdf1").sex("女").point("67").math(18).english(60).build();
User user5 = User.builder().name("sdf1").sex("女").point("90").math(9).english(70).build();
List<User> list = List.of(user1, user2, user3, user4, user5);
Map map = list.stream().collect(Collectors.groupingBy(User::getName, Collectors.counting()));
====================结果=================
{sdf=2, sdf1=1, pdf1=1, xdf1=1}
将列表根据属性进行分组,并计算数量