Java--JDK1.8Stream

//生成流

        Stream<Integer> integerStream = Stream.of(1, 2, 3);
        Stream<Integer> stream = Arrays.stream(new Integer[]{2, 1, 3});

map方法–获取集合中每一个元素中的一个字段的值

List<User> lst=new ArrayList<>();
        User user02=new User();
        user02.setId(2);
        user02.setUserName("2");
        user02.setPassword("2");
        lst.add(user02);
        User user01=new User();
        user01.setId(1);
        user01.setUserName("1");
        user01.setPassword("1");
        lst.add(user01);
        List<String> lst02=lst.stream().map(User::getPassword).collect(Collectors.toList());
        System.out.println(lst02);

也可以改变集合中每一个元素的值
如下将集合中的每一个数乘以2

List<Integer> lst=new ArrayList<>();
        lst.add(1);
        lst.add(2);
        lst.add(3);
        lst.stream().map(i -> i * 2).forEach(i->System.out.println(i));
        List<Integer> collect = lst.stream().map(i -> i * 2).collect(Collectors.toList());
        System.out.println(collect);

分组,如下根据userName进行分组

List<User> lst=new ArrayList<>();
        User user01=new User();
        user01.setId(1);
        user01.setUserName("name1");
        lst.add(user01);

        User user02=new User();
        user02.setId(2);
        user02.setUserName("name2");
        lst.add(user02);

        User user03=new User();
        user03.setId(3);
        user03.setUserName("name2");
        lst.add(user03);

        Map<String, List<User>> groupList = lst.stream().collect(Collectors.groupingBy(User::getUserName));
        for (Map.Entry<String,List<User>> entry:groupList.entrySet()){
            System.out.println(entry.getKey()+"-"+entry.getValue());
        }

分组、指定的字段合为Set

        List<User> lst=new ArrayList<>();
        lst.add(new User("u1", "p1"));
        lst.add(new User("u1", "p2"));
        lst.add(new User("u1", "p2"));
        lst.add(new User("u2", "p1"));
        lst.add(new User("u3", "p1"));
        Map<String, Set<String>> map = lst.stream().collect(Collectors.groupingBy(User::getUserName,
                Collectors.mapping(User::getPassword, Collectors.toSet())));
        System.out.println(JSON.toJSONString(map));

根据多个字段分组

Map<String, List<User>> groupList = lst.stream()
            .collect(Collectors.groupingBy(user->user.getId()+"_"+user.getUserName()));
        System.out.println(JSONObject.toJSONString(groupList));

以及求每一组的最大的元素

 List<User> lst=new ArrayList<>();
        User user01=new User();
        user01.setId(1);
        user01.setUserName("name1");
        lst.add(user01);

        User user02=new User();
        user02.setId(2);
        user02.setUserName("name2");
        lst.add(user02);

        User user03=new User();
        user03.setId(3);
        user03.setUserName("name2");
        lst.add(user03);

        //分组求每一组最大的--参考https://www.jianshu.com/p/ea3875d14c47
        Map<String, Optional<User>> dataList = lst.stream()
                .collect(Collectors.groupingBy(User::getUserName,
                        Collectors.maxBy(Comparator.comparingInt(User::getId))));
        for (Map.Entry<String, Optional<User>> entry:dataList.entrySet()){
            System.out.println(entry.getKey()+"-"+JSONObject.toJSONString(entry.getValue().get()));
        }

分组后求指定字段的和

Map<String, Integer> collect = lst.stream().collect(Collectors.groupingBy(User::getUserName,
                Collectors.summingInt(User::getId)));
        System.out.println(collect);

求和

        List<Integer> l = new ArrayList<>(Arrays.asList(1, 2, 3, 4, 5));
        Integer sum = l.stream().reduce(Integer::sum).orElse(0);
        System.out.println(sum);
        long sum1 = l.stream().collect(Collectors.summarizingInt(value -> value)).getSum();
        System.out.println(sum1);
List<User> userList = new ArrayList<>();
		for (int i = 0; i < 10; i++) {
			User user = new User();
			user.setId(i);
			user.setUserName("u" + i);
			userList.add(user);
		}
		//求和
		int sum = userList.stream().mapToInt(User::getId).sum();
		System.out.println(sum);

求平均数

List<User> userList = new ArrayList<>();
		for (int i = 0; i < 10; i++) {
			User user = new User();
			user.setId(i);
			user.setUserName("u" + i);
			userList.add(user);
		}
		//求平均数
		Double averaging = userList.stream().collect(Collectors.averagingInt(User::getId));
		System.out.println(averaging);

转为key-value

        Map<Integer, User> collect = lst.stream().collect(Collectors.toMap(User::getId, Function.identity()));
        System.out.println(JSON.toJSONString(collect));

转map出现key重复,取第一个

    @Test
    public void test(){
        List<User> userList=new ArrayList<>();
        userList.add(new User(1, "u1-1"));
        userList.add(new User(1, "u1-2"));
        userList.add(new User(2, "u2"));
        userList.add(new User(3, "u3"));
        //出现id重复的,取第一个
        Map<Integer, User> userMap = userList.stream().collect(Collectors.toMap(User::getId, Function.identity(), (u1, u2) -> u1));
        System.out.println(JSON.toJSONString(userMap));
    }

sort–排序

		class User{

			private Integer id;

			private Integer num;

			public User(Integer id, Integer num) {
				this.id = id;
				this.num = num;
			}

			public Integer getId() {
				return id;
			}

			public void setId(Integer id) {
				this.id = id;
			}

			public Integer getNum() {
				return num;
			}

			public void setNum(Integer num) {
				this.num = num;
			}
		}

		List<User> lst=new ArrayList<>();
		lst.add(new User(3,1));
		lst.add(new User(1,1));
		lst.add(new User(1,2));
		lst.add(new User(2,3));
		lst.add(new User(2,1));
		//id升序,num降序
		List<User> collect03 = lst.stream().sorted(Comparator.comparing(User::getId)
				.thenComparing(User::getNum,Comparator.reverseOrder())).collect(Collectors.toList());
		for (User user:collect03){
			System.out.println(user.getId()+"   "+user.getNum());
		}

还有一种排序,排序出来有疑问,没磕出来

        //这种有问题,结果见输出
		List<User> collect01 = lst.stream().sorted(Comparator.comparing(User::getId).reversed()
				.thenComparing(User::getNum).reversed()).collect(Collectors.toList());
			for (User user:collect01){
			System.out.println(user.getId()+"   "+user.getNum());
		}
		System.out.println();
		List<User> collect02 = lst.stream().sorted(Comparator.comparing(User::getId,Comparator.reverseOrder())
				.thenComparing(User::getNum,Comparator.reverseOrder())).collect(Collectors.toList());
		for (User user:collect02){
			System.out.println(user.getId()+"   "+user.getNum());
		}

输出结果

1   2
1   1
2   3
2   1
3   1

3   1
2   3
2   1
1   2
1   1

一般用第二种。
两种排序参考
https://www.cnblogs.com/kuanglongblogs/p/11230250.html#commentform

stream
求数

		//Stream
        List<String> lst=new ArrayList<>();
        lst.add("1");
        lst.add("2");
        lst.add("3");
        Stream<String> stream = lst.stream();
        //生成的stream只能执行一次count或者max末端方法
        //System.out.println(stream.count());
        //获取最大的
        System.out.println(stream.max((o1, o2) -> Integer.parseInt(o1)-Integer.parseInt(o2)).get());
       

过滤:

 //筛选出字符为3的数据
        List<String> l=lst.stream().filter(str -> str.equals("3")).collect(Collectors.toList());
        l.forEach(s->{System.out.println(s);});

校验:

        List<String> lst=new ArrayList<>();
        lst.add("1");
        lst.add("1");
        lst.add("2");
        lst.add("3");
        boolean b = lst.stream().anyMatch(str -> str.equals("3"));
        System.out.println(b);
        User user01=new User();
        user01.setId(1);
        user01.setUserName("1");
        List<User> lstUser=new ArrayList<>();
        lstUser.add(user01);

        User user02=new User();
        user02.setId(2);
        user02.setUserName("2");
        lstUser.add(user02);
        List<Integer> lstIds = lstUser.stream().map(user -> user.getId())
                .collect(Collectors.toList());
        lstIds.forEach(str->System.out.println(str));
        System.out.println(lstUser.stream().mapToInt(user -> user.getId()).max().getAsInt();
        System.out.println(lstUser.stream().count());
        System.out.println(lstIds.stream().sorted(Comparator.comparing(User::getId))
                .collect(Collectors.toList()));
    }

    public static class User implements Comparable<User>{

        private Integer id;

        private String userName;

        public Integer getId() {
            return id;
        }

        public void setId(Integer id) {
            this.id = id;
        }

        public String getUserName() {
            return userName;
        }

        public void setUserName(String userName) {
            this.userName = userName;
        }

        @Override
        public int compareTo(User user) {
            return this.id.compareTo(user.getId());
        }
    }

flatMap

//参考:https://www.cnblogs.com/HowieYuan/p/9394552.html
        //拆分得到字符串
        /*List<String> list = new ArrayList<>();
        list.add("aaa bbb ccc");
        list.add("ddd eee fff");
        list.add("ggg hhh iii");
        list = list.stream().map(s -> s.split(" ")).flatMap(Arrays::stream).collect(Collectors.toList());
        System.out.println(JSONObject.toJSONString(list));*/

//根据指定指端求最大的元素

        List<User> lst=new ArrayList<>();
        User user01=new User();
        user01.setId(1);
        user01.setUserName("name1");
        user01.setNum(1);
        lst.add(user01);

        User user02=new User();
        user02.setId(2);
        user02.setNum(3);
        user02.setUserName("name2");
        lst.add(user02);
        Optional<User> collect = lst.stream().collect(Collectors.maxBy(Comparator.comparing(User::getNum)));
        System.out.println(JSONObject.toJSONString(collect.get()));

合并指定字符串

String collect = lst.stream().map(user -> user.getUserName()).collect(Collectors.joining(","));
        System.out.println(collect);

排序获取最大id

        List<Integer> idList=new ArrayList<>();
        idList.add(2);
        idList.add(1);
        idList.add(3);
        Integer maxId = idList.stream().max((o1, o2) -> o1 - o2).orElse(0);
        System.out.println(maxId);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值