java8特性-List.stream()的用法

package com.liurq.other.jdk8streamdemo;

import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;

public class StreamDemo {
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>();
        list.add("张三");
        list.add("张三");
        list.add("李四");
        list.add("王五");
        list.add("刘六");
        list.add("孙七");
        list.add("郝八");

        //统计个数--7
        System.out.println(list.stream().count());
        //去重--[张三, 李四, 王五, 刘六, 孙七, 郝八]
        List<String> distinctList = list.stream().distinct().collect(Collectors.toList());
        //遍历
        distinctList.stream().forEach(a-> System.out.println(a));

        //过滤--[李四, 王五, 刘六, 孙七, 郝八]
        List<String> filterList = list.stream().filter(a -> !"张三".equals(a)).collect(Collectors.toList());
        System.out.println(filterList);

        //限制个数 --[李四, 王五, 刘六]
        List<String> limitList = filterList.stream().limit(3).collect(Collectors.toList());
        System.out.println(limitList);

        //跳过 --[王五, 刘六, 孙七, 郝八] --从第三个开始
        List<String> skipList = list.stream().skip(3).collect(Collectors.toList());
        System.out.println(skipList);

        //map映射 [1, 2, 3, 4, 5, 6, 7, 8, 9]
        List<Integer> ints = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9);
        List<String> mapList = ints.stream().map(a -> a + "").collect(Collectors.toList());
        System.out.println(mapList);

        ArrayList<User> users = new ArrayList<>();
        users.add(new User("张三",12,180.5D,"1"));
        users.add(new User("张三",18,180.5D,"2"));
        users.add(new User("李四",23,169.5D,"2"));
        users.add(new User("王五",45,178D,"2"));
        users.add(new User("刘六",12,123D,"2"));
        users.add(new User("孙七",54,189D,"1"));
        users.add(new User("郝八",23,185.2D,"1"));

        //[User{name='张三', age=12, height=180.5, sex='1'}, User{name='孙七', age=54, height=189.0, sex='1'}, User{name='郝八', age=23, height=185.2, sex='1'}]
        List<User> manList = users.stream().filter(a -> a.getSex().equals("1")).collect(Collectors.toList());
        System.out.println(manList);

        //处理某个字段,注意此用法会影响原来的对象的值
        List<User> nameAdd1List = users.stream().map(a -> {
            User clone = (User)a.clone();
            if (clone != null){
                clone.setName(a.getName() + "1");
            }
            return clone;
        }).collect(Collectors.toList());
        //[User{name='张三1', age=12, height=180.5, sex='1'}, User{name='张三1', age=18, height=180.5, sex='2'}, User{name='李四1', age=23, height=169.5, sex='2'}, User{name='王五1', age=45, height=178.0, sex='2'}, User{name='刘六1', age=12, height=123.0, sex='2'}, User{name='孙七1', age=54, height=189.0, sex='1'}, User{name='郝八1', age=23, height=185.2, sex='1'}]
        System.out.println(nameAdd1List);

        //将list转换为map --{孙七=User{name='孙七', age=54, height=189.0, sex='1'}, 李四=User{name='李四', age=23, height=169.5, sex='2'}, 王五=User{name='王五', age=45, height=178.0, sex='2'}, 郝八=User{name='郝八', age=23, height=185.2, sex='1'}, 刘六=User{name='刘六', age=12, height=123.0, sex='2'}}
        Map<String, User> userMap = users.stream().filter(a->!"张三".equals(a.getName())).collect(Collectors.toMap(User::getName, user -> user));
        System.out.println(userMap);

        //将list转换为map --{孙七=User{name='孙七', age=54, height=189.0, sex='1'}, 李四=User{name='李四', age=23, height=169.5, sex='2'}, 王五=User{name='王五', age=45, height=178.0, sex='2'}, 郝八=User{name='郝八', age=23, height=185.2, sex='1'}, 刘六=User{name='刘六', age=12, height=123.0, sex='2'}}
        Map<String, User> userMap2 = users.stream().filter(a->!"张三".equals(a.getName())).collect(Collectors.toMap(User::getName, Function.identity()));
        System.out.println(userMap2);

        //如果key可能重复的话,需要指定处理方法 --{孙七=User{name='孙七', age=54, height=189.0, sex='1'}, 李四=User{name='李四', age=23, height=169.5, sex='2'}, 张三=User{name='张三', age=18, height=180.5, sex='2'}, 王五=User{name='王五', age=45, height=178.0, sex='2'}, 郝八=User{name='郝八', age=23, height=185.2, sex='1'}, 刘六=User{name='刘六', age=12, height=123.0, sex='2'}}
        Map<String, User> distinctUserMap = users.stream().collect(Collectors.toMap(User::getName, Function.identity(), (k1, k2) -> k2));
        Map<String, User> distinctUserMap2 = users.stream().collect(Collectors.toMap(User::getName, user->user, (k1, k2) -> k2));
        System.out.println(distinctUserMap);

        //控制map的类型,此处指定为LinkedHashMap --{张三=User{name='张三', age=18, height=180.5, sex='2'}, 李四=User{name='李四', age=23, height=169.5, sex='2'}, 王五=User{name='王五', age=45, height=178.0, sex='2'}, 刘六=User{name='刘六', age=12, height=123.0, sex='2'}, 孙七=User{name='孙七', age=54, height=189.0, sex='1'}, 郝八=User{name='郝八', age=23, height=185.2, sex='1'}}
        Map<String, User> distinctUserMap3 = users.stream().collect(Collectors.toMap(User::getName, user->user, (k1, k2) -> k2, LinkedHashMap::new));
        System.out.println(distinctUserMap3);
        System.out.println(distinctUserMap3 instanceof LinkedHashMap);  //true
        System.out.println(distinctUserMap2 instanceof LinkedHashMap);  //false
        System.out.println(distinctUserMap2 instanceof HashMap);  //true
    }

    static class User implements Cloneable{
        private String name;
        private int age;
        private double height;
        private String sex;

        public User(){

        }

        public User(String name, int age, double height, String sex) {
            this.name = name;
            this.age = age;
            this.height = height;
            this.sex = sex;
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public int getAge() {
            return age;
        }

        public void setAge(int age) {
            this.age = age;
        }

        public double getHeight() {
            return height;
        }

        public void setHeight(double height) {
            this.height = height;
        }

        public String getSex() {
            return sex;
        }

        public void setSex(String sex) {
            this.sex = sex;
        }

        @Override
        public String toString() {
            return "User{" +
                    "name='" + name + '\'' +
                    ", age=" + age +
                    ", height=" + height +
                    ", sex='" + sex + '\'' +
                    '}';
        }

        @Override
        protected Object clone()  {
            User user = null;
            try {
                user =  (User)super.clone();
            } catch (Exception e) {
                e.printStackTrace();
            }
            return user;
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值