Java 8 API添加了一个新的抽象称为流Stream,可以让你以一种声明的方式处理数据。
Stream 使用一种类似用 SQL 语句从数据库查询数据的直观方式来提供一种对 Java 集合运算和表达的高阶抽象。
Stream API可以极大提高Java程序员的生产力,让程序员写出高效率、干净、简洁的代码。
这种风格将要处理的元素集合看作一种流, 流在管道中传输, 并且可以在管道的节点上进行处理, 比如筛选, 排序,聚合等。
java8 stream 在开发中的常用方法
- 先创建一个list集合初始化一些数据
private static List<SysUser> userList = Lists.newArrayList();
static {
SysUser u1 = new SysUser();
u1.setUsername("name-1");
u1.setPassword("password-1");
u1.setSex(1);
userList.add(u1);
SysUser u2 = new SysUser();
u2.setUsername("name-2");
u2.setPassword("password-2");
u2.setSex(1);
userList.add(u2);
SysUser u3 = new SysUser();
u3.setUsername("name-3");
u3.setPassword("password-3");
u3.setSex(2);
userList.add(u3);
}
1.从List中获取子属性
- 从user中提取用户名信息
@Test
void getUsername(){
List<String> userNames = userList.stream().map(SysUser::getUsername).collect(Collectors.toList());
System.out.println(userNames);
}
运行结果
[name-1, name-2, name-3]
2.分组统计
- 将用户按照性别分组
@Test
void groupBySex(){
Map<Integer, List<SysUser>> collect = userList.stream().collect(Collectors.groupingBy(SysUser::getSex));
System.out.println(collect);
}
运行结果
{1=[SysUser{username=‘name-1’, sex=1, password=‘password-1’}, SysUser{username=‘name-2’, sex=1, password=‘password-2’}], 2=[SysUser{username=‘name-3’, sex=2, password=‘password-3’}]}
3.过滤
- 根据用户性别过滤,过滤出sex=1的用户
@Test
void filterBySex(){
List<SysUser> collect = userList.stream().filter((u) -> u.getSex() == 1).collect(Collectors.toList());
System.out.println(collect);
}
运行结果
[SysUser{username=‘name-1’, sex=1, password=‘password-1’}, SysUser{username=‘name-2’, sex=1, password=‘password-2’}]
4.排序
- 根据年龄排序
@Test
void sortSex() {
List<SysUser> collect = userList.stream().sorted(Comparator.comparingInt(SysUser::getAge)).collect(Collectors.toList());
System.out.println(collect);
}
运行结果
[SysUser{username=‘name-1’, sex=1, age=18, password=‘password-1’}, SysUser{username=‘name-2’, sex=1, age=19, password=‘password-2’}, SysUser{username=‘name-3’, sex=2, age=20, password=‘password-3’}]
5.转换Map
- 将数据结构转换为 k: 用户ID value: 用户信息的map
@Test
void filterBySex(){
Map<Integer,String> userMap = userList.stream().collect(Collectors.toMap(User::getId, Function.identity()));
}