资讯详情

Java Stream 使用指南(一)

最近换了公司,翻了别人的代码,发现用了很多代码。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}

将列表根据属性进行分组,并计算数量

标签: jku3e3变送器

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

 锐单商城 - 一站式电子元器件采购平台  

 深圳锐单电子有限公司