1.stream.filter
stream.filter一般适用于list集合,主要作用就是模拟sql查询,从集合中查询想要的数据。filter里面的参数user是指集合里面的每一项
//在集合中查询用户名为huxiansen的集合
List<User> userList = list.stream().filter(user -> "huxiansen".equals(user.getUsername())).collect(Collectors.toList());
//在集合中查询出第一个用户密码为123456的用户
Optional<User> user = list.stream().filter(userTemp -> "123456".equals(userTemp.getPassword())).findFirst();
过滤 , filter(item->{}) , item为每一项。 按照自己的需求来筛选list中的数据
List<Person> filterList = list.stream().filter(item->item.getAge()>3).collect(Collectors.toList());
map(), 提取对象中的某一元素,用每一项来获得属性(也可以直接用 ?对象::get属性())
List<String> mapList1 = list.stream().map(Person::getName).collect(Collectors.toList());
2.ObjectUtils.isEmpty
String a=null;
String b="xiaoxian";
String c="";
String a = null ; 申明一个string类型的 a,同时在内存里申请了一个地址,但是该地址不指向任何引用地址;
String c = “” ;申明一个string类型的 a,既在内存里申请了地址,该地址又指向一个引用该字符串的引用地址;
如果我们使用isEmpty判断字符串是否为空
System.out.println(a.isEmpty());
System.out.println(b.isEmpty());
System.out.println(c.isEmpty());
输出结果:
Exception in thread “main” java.lang.NullPointerException
at d.main(d.java:13)
false
true
第一个输出是空指针异常。
在springboot项目中我们可以使用org.springframework.util.ObjectUtils解决这个问题,
ObjectUtils.isEmpty底层实质就是和null进行比较
字符串的实质就是字符数组,也就是说该方法是用来判断该引用地址中是否存在值,前提条件是指向引用地址,但是null不会指向引用地址,就像地址表一样,地址表为空,自然报空指针异常。
3. stream().map((item) -> {}).collect()
假如存在对象数组A,包含一些属性,现在需要给A加一些属性,并输出对象数组B,涉及到两个知识点:(1)需要把A的对象挨个增加新的属性;(2)输出B,则需要把A的属性都复制到B。
要求:
①把A的属性复制过来
不能使用set方法一个一个复制,可以直接复制对象
BeanUtils.copyProperties(a, b);
②循环给B中的每个对象赋值name值
不能使用for循环遍历A里面的所有对象,那是java7的用法,java8用 stream().map.collect就可以了
有list对象数组A,有属性userId和model,现在需要输出对象数组B,数组B中包含所有A中的对象,但需要多一个属性nameList<B> listB = aList.stream().map(a->{
B b = new B();
String name;
name = "XXXX";
BeanUtils.copyProperties(a, b);
b.setName(name);
return b;
}).collect(Collectors.toList());
4.例如
遍历a,将a中不为空的id都赋值给b中的id
idList<B> listB=alist.stream().filter(item->!ObjectUtils.isEmpty(item.getId())).map(a->{
B b = new B();
BeanUtils.copyProperties(a, b);
b.setId(id);
return b;
}).collect(Collectors.toList());
举例:
一张数据表user包括id,name,age,gender。
用List<User>装该数据表的全部数据,在这里我们假如直接获得这部分数据:
List<User> users = getUsers();
现在需要全部的name数据,我们可以:
List<String> names = users.stream().map(User::getName()).collect(Collectors.toList());
解释:
stream:stream不是一种数据结构,它只是某种数据源的一个视图,数据源可以是一个数组,Java容器或I/O channel等。对stream进行修改不会修改任何一个背后的数据源。
map:接收一个函数作为参数,该函数被应用到每个元素上,并将其映射成一个新的元素。
collect:属于terminal operation,必须加在后面,否则会报错。
Collectors.toList()用来结束Stream流。