Stream

—前言
在极光的那些天,作为一名开发小白,总是爱手写一些for导致代码不够优雅…
要努力变优雅!优雅永不过时!

➢Stream自己不会存储元素。
➢Stream不会改变源对象。 相反,他们会返回一个持有结果的新Stream。
➢Stream 操作是延迟执行的。这意味着他们会等到需要结果的时候才执行。

java stream流取最早的 java stream流操作_java

主要就是3个操作

1.创建流
2.中间操作(是对原来的源不会进行影响的,只针对流进行操作)
3.终止操作,不终止的话就一直是流,可以打印或者转为别的集合类型等…


Stream入门操作

假如有个User对象 属性为:(name,age,size)
我们创建一个List

List<User> list = Arrays.asList(
                new User("wang1",1,1),
                new User("wang2",2,2),
                new User("wang3",3,3),
                new User("wang4",4,4)
        );

那么我们通过流,用fliter过滤一下age大于1的,并用map映射一下User的name(用getName方法),再遍历整个流,逐个打印

list.stream().filter((x)->x.getAge()>1)
	.map(User::getName).forEach(System.out::println);

如果想将其中的name转为大写那么就↓

list.stream().map((x)->x.getName().toUpperCase())
	.forEach(System.out::println);

使用groupingBy实现对list的分组

举个例子:将User按照性别进行划分

如果User的属性是(name,age,sex) 性别有男(man),女(woman)

List<User> userList = Arrays.asList(
            new User("wang1",1,"man"),
            new User("wang2",2,"woman"),
            new User("wang3",3,"man"),
            new User("wang4",4,"woman")
        );

若想以Integer为Key将List中所存的对象分类,
存为Map<Integer,List<User>>
关键是groupingBy((s) -> s.getSex() == “man” ? 0 : 1))

也就是说性别等于"man"的key为0,否则为1

Map<Integer, List<User>> collect1 = userList.stream()
		.collect(Collectors.groupingBy((s) -> s.getSex() == "man" ? 0 : 1));

存为Map<String, List<User>>
User::getSex 的话就是按照String为Key

也就是说男性存在key为"man"处,女性存于"woman"处

Map<String, List<User>> collect1 = userList.stream().collect(Collectors.groupingBy(User::getSex));

当然得到的List我们也可以将其再转为stream进行遍历打印

collect1.get("man").stream()
	.map(User::getName).forEach(System.out::println);

再举个例子:
如果想将List中的数字按照奇数偶数进行划分?

List<Integer> list = Arrays.asList(1,2,3,4,5,6,8,9,10);

按照奇数偶数分组
思路是new一个map<Integer,List<Integer>>
判断一个数如果是奇数,那么就存到false存奇数存到key为1的Map中,
偶数存到key为0的Map中

Map<Integer, List<Integer>> collect = list.stream().collect(Collectors.groupingBy((i) -> i % 2));
System.out.println(collect);

这样操作就肥肠方便啦~


关于使用Stream将数组转List

关于boxed()

先看下boxed方法的源码

@Override
    public final Stream<Integer> boxed() {
        return mapToObj(Integer::valueOf);
    }

boxed的作用就是将int类型的stream转成了Integer类型的Stream。

基本类型转List

因为List中需要存的泛型是对象,像是int这种基本类型是不行的.
所以如果需要使用stream()流,将int[]数组转为List<Integer>
那么记得使用boxed()进行封装(如下)

int[] arr = {1,2,3,4,5,6,7};
Arrays.stream(arr).forEach(System.out::println);
List<Integer> collect = Arrays.stream(arr).boxed().collect(Collectors.toList());

但是char数组转List会有些特殊

因为字符数组是没有.stream操作的
通常做法是:
将字符串数组先变成String,然后通过chars()拆分成多个ASCII码值
再使用mapToObj()将一个个int码的stream转为对象流
map()和mapToObj()的区别

Stream<Character> characterStream = new String(chars)
   .chars().mapToObj(i -> (char) i);

然后再将这个对象流转为List<Charactor>

List<Character> list = new String(chars)
	.chars().mapToObj(i -> (char) i)
	.collect(Collectors.toList());

非基本类型转List

这个就不用boxed()进行封装了!List的泛型是支持的!
转一个String数组

String[] arr = new String[]{"123","234","345"};
List<String> collect = Arrays.stream(arr).collect(Collectors.toList());

转一个User数组试试

User[] users = new User[3];
users[0] = new User("wang1",1,"nan",true);
users[1] = new User("wang2",2,"nan",true);
users[2] = new User("wang3",3,"nan",true);
List<User> collect1 = Arrays.stream(users).collect(Collectors.toList())
System.out.println(collect1);

之后总结数组转List: 集合与集合之间的转型汇总

接下来记录一下常用的stream操作
顺便分析一下实习期间大神们是怎么用stream的~
[未完待续…]