ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

开发神器,拿走不谢【Java8 Stream】

2021-02-09 16:58:52  阅读:256  来源: 互联网

标签:Stream 不谢 List System userList User println Java8 out


每一种开发语言都提供了丰富的工具库,作为当今最流行的的开发语言之一,Java肯定也不例外。

但是今天不讲Java集合工具类,我们来讲讲Java8的特性之一 Stream。用好Stream,可以极大提高我们的开发效率,好了开始今天的课程~

java8流操作来自林老师带你学编程00:0000:46收录于话题#java2个

一、循环过滤

我们平常开发最经常使用的就是循环、排序、统计之类的,下面我们以一个实际的例子来演示说明。

从一个List过滤空字符串并输出不含空字符的数据

List<String> stringList = Arrays.asList("abc", "", "bc", "efg", "abcd", "", "jkl");
List<String> filtered = new ArrayList<>();
for (String str : stringList) {
    if (!str.isEmpty()) {
        filtered.add(str);
    }
}
System.out.println(filtered.toString());

传统的代码必须通过循环来实现,需要写一堆的代码来判断组装,非常麻烦,下面我们来看看Stream的实现。

List<String> stringList = Arrays.asList("abc", "", "bc", "efg", "abcd", "", "jkl");
List<String> filtered = stringList.stream().filter(string -> !string.isEmpty()).collect(Collectors.toList());
System.out.println(filtered.toString());

简简单单两行代码就可以实现了,非常简单。

二、数据统计

在平常开发过程中,很经常需要对数据进行汇总操作,例如我们将一个整数集合中所有数据叠加并输出。

List<Integer> numList = Arrays.asList(1, 2, 3, 4, 5);
int sum = 0;
for (Integer num : numList) {
    sum += num;
}
System.out.println(sum);

采用Stream两行就搞定了。

List<Integer> numList = Arrays.asList(1, 2, 3, 4, 5);
int sum = numList.stream().reduce(Integer::sum).orElse(0);
System.out.println(sum);

上面的例子是集合本身就是Integer类型,如果本身是对象呢?

List<User> userList = new ArrayList<>();
User user1 = new User();
user1.setAge(1);
User user2 = new User();
user2.setAge(2);
userList.add(user1);
userList.add(user2);
int sum = userList.stream().mapToInt(User::getAge).sum();
System.out.println(sum);

对集合对象的某一个属性进行字段求和也很简单,两行代码搞定。

三、分组汇总

下面再来说一个更骚的操作,我们平常处理数据的时候,经常需要对数据进行分组求和,例如这样一个场景,一个List中存储了很多的用户数据,现在需要统计:性别男的平均年龄和性别女的平均年龄,我们先来看看传统的实现。

List<User> userList = new ArrayList<>();
User user1 = new User();
user1.setAge(10);
user1.setSex('男');
User user2 = new User();
user2.setAge(20);
user2.setSex('男');
User user3 = new User();
user3.setAge(5);
user3.setSex('女');
User user4 = new User();
user4.setAge(15);
user4.setSex('女');
userList.add(user1);
userList.add(user2);
userList.add(user3);
userList.add(user4);
int boyAverageAge = 0, boyTotalAge = 0,boyNum = 0;
int girlAaverageAge = 0, girlTotalAge = 0, girlNum = 0;
for (User user : userList) {
    if (user.getSex() == '男') {
        boyTotalAge = boyTotalAge + user.getAge();
        boyNum++;
     } else {
         girlTotalAge = girlTotalAge + user.getAge();
         girlNum++;
     }
}
boyAverageAge = boyTotalAge/boyNum;
girlAaverageAge = girlTotalAge/girlNum;
System.out.println(boyAverageAge);
System.out.println(girlAaverageAge);

这拉皮条的代码真是太恶心了,接下来我们来看看Stream是如何化腐朽与神奇的。

Map<Character, Double> counting = userList.stream().collect(Collectors.groupingBy(User::getSex, Collectors.averagingInt(User::getAge)));
System.out.println(counting.get('男'));
System.out.println(counting.get('女'));

一行就可以搞定分组并求平均值的功能,相比我们自己写循环去处理,采用Stream的方式至少可以提升两倍的开发效率,总结一句就是非常强大、非常高效。

四、循环打印

开发过程中循环操作是一个最基本的操作,几乎都会涉及到这个操作,传统的循环操作想必大家都知道,我们来看看Stream是如何进行循环的。

例如我们想要输出所有男孩的信息,我们可以这样做。

userList.stream().filter(n -> n.getSex() == '男').forEach(p -> System.out.println(p));

也是超级简单,一行代码就可以搞定。

五、排序

最后我们再来看看Stream是如何实现排序的

 List<User> userSortList = userList.stream().sorted((p1, p2) -> p1.getAge() - p2.getAge()).collect(Collectors.toList());

排序有些人可能会迷糊p1.getAge() - p2.getAge()这行代码是什么意思,它的含义是p1在前面就是顺序(从小到大),p2在前面就是逆序(从大到小)。

六、总结

平时开发过程中,我们一定要善于使用各种工具,它可以帮助我们大大节省开发时间,就比如Stream,用的好的话,可以节省我们一半的开发时间。当然工具也不能滥用,不然可能会出现性能问题,下一期再给大家分享一波滥用工具导致性能问题的场景。

-----------------------

公众号:林老师带你学编程

网站:wolzq.com

代码无非增删改查,关注老师给你Coding

图片

林老师带你学编程https://wolzq.com  

标签:Stream,不谢,List,System,userList,User,println,Java8,out
来源: https://blog.csdn.net/linzhiqiang0316/article/details/113772673

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有