java.util.stream包下有一个Stream接口,有很多实用的方法,常用的几个:
Stream<T> filter(Predicate<? super T> predicate)返回由与此给定谓词匹配的此流的元素组成的流。
<R> Stream<R> map(Function<? super T,? extends R> mapper)返回由给定函数应用于此流的元素的结果组成的流。
Stream<T> sorted()返回由此流的元素组成的流,根据自然顺序排序。
Stream<T> sorted(Comparator<? super T> comparator)返回由该流的元素组成的流,根据提供的 Comparator进行排序。
Stream<T> limit(long maxSize)返回由此流的元素组成的流,截短长度不能超过 maxSize 。
思考题:一分钟内完成此题,只能用一行代码实现!
现在有5个用户,筛选:
1、ID 必须是偶数
2、年龄必须大于23岁
3、用户名转为大写字母
4、用户名字母倒着排序
5、只输出一个用户
import java.util.Arrays;
import java.util.List;
/**
* 其中sort为什么知道是通过name排序?因为上一步是通过map拿到了用户的name
*/
public class MyTest{
public static void main(String[] args) {
User u1 = new User(1,"a",21);
User u2 = new User(2,"b",22);
User u3 = new User(3,"c",23);
User u4 = new User(4,"d",24);
User u5 = new User(6,"e",25);
List<User> list = Arrays.asList(u1, u2, u3, u4, u5);
list.stream().filter(u->{return u.getId()%2==0;}).filter(u->{return u.getAge()>23;})
.map(u->{return u.getName().toUpperCase();}).sorted((uu1,uu2)->{return uu2.compareTo(uu1);})
.limit(1).forEach(System.out::println);
//System.out::println就是把你遍历出来的每一个对象都用来去调用System.out
// (也就是PrintStream类的一个实例)的println方法。
//Consumer<String> c1 = System.out::println;等价于
//Consumer<String> c2 = (x)->System.out.println(x);
}
}
class User{
private int id;
private String name;
private int age;
public User(int id, String name, int age) {
this.id = id;
this.name = name;
this.age = age;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
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;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", age=" + age +
'}';
}
}
开发小技巧:如何对三级分类列表进行封装?
stream加递归调用
注意排序的时候要注意排序是否为null
@Override
public List<CategoryEntity> listWithTree() {
//查出所有的分类
List<CategoryEntity> entities = baseMapper.selectList(null);
//组装成父子的树形结构,使用stream来完成
//过滤所有的一级分类并将其转换成list
List<CategoryEntity> level1 = entities.stream().filter((categoryEntity) -> categoryEntity.getParentCid() == 0).map((menu) -> {
menu.setChildren(getChildren(menu, entities));
return menu;
}).sorted((menu1, menu2) -> { return (menu1.getSort()==null?0:menu1.getSort()) - (menu2.getSort()==null?0:menu2.getSort());}).collect(Collectors.toList());
return level1;
}
//递归查找所有菜单的子菜单
//找出root的所有子菜单的同时找到子菜单的子菜单,递归调用
//核心在于通过过滤找到一级菜单的子菜单后,通过map流再次调用找子菜单的方法,以便找到所有的二级菜单的子菜单
private List<CategoryEntity> getChildren(CategoryEntity root, List<CategoryEntity> all) {
List<CategoryEntity> children = all.stream().filter(categoryEntity -> categoryEntity.getParentCid() == root.getCatId()).map((categoryEntity -> {
categoryEntity.setChildren(getChildren(categoryEntity, all));
return categoryEntity;
})).sorted((menu1, menu2) -> { return (menu1.getSort()==null?0:menu1.getSort()) - (menu2.getSort()==null?0:menu2.getSort());}).collect(Collectors.toList());
return children;
}