其实使用Java8很多年了,虽然一直也在用集合的stream操作,但是一直没有总结,今天就将stream的常用操作做一个总结,
至于stream的概念不会过多介绍,直接给出常用操作的案例,当然也是博主用的比较多的,后面有其他用法,也会补充进来
废话不多说,直接上代码:
package org.dudu.test;
import org.junit.Before;
import org.junit.Test;
import java.util.*;
import java.util.stream.Collectors;
/**
* Java8 stream常用方法
*/
public class StreamTestDemo {
private List<User> userList;
@Before
public void createUserList(){
userList = new ArrayList<User>();
User user1 = new User("张三",20);
User user2 = new User("李四",25);
User user3 = new User("王五",30);
User user4 = new User("王麻子",32);
User user5 = new User("老王",30);
User user6 = new User("老李",25);
User user7 = new User("老张",30);
userList.add(user1);
userList.add(user2);
userList.add(user3);
userList.add(user4);
userList.add(user5);
userList.add(user6);
userList.add(user7);
}
/**
* 常规操作
*/
//@Test
public void streamCommon(){
/**
* Java8 stream常规用法
*/
userList.stream().forEach((user) -> System.out.println(user.getAge()));
}
/**
* 过滤
*/
@Test
public void streamFilter(){
/**
* 过滤操作,筛选出年龄30的用户,组装成一个list<user>
*/
List<User> userMap = userList.stream().filter((user) -> user.getAge() == 30).collect(Collectors.toList());
userMap.stream().forEach(System.out::println);
}
/**
* 映射
*/
@Test
public void streamMap(){
/**
* 给其中每个用户的年龄增加5岁
*/
List<User> userMap = userList.stream().map(user -> { user.setAge(user.getAge() + 5);return user;}).collect(Collectors.toList());
userMap.stream().forEach(System.out::println);
}
/**
* 映射
*/
@Test
public void streamMapsum(){
/**
* 计算给定用户的年龄和
*/
int sumAges = userList.stream().mapToInt(User::getAge).sum();
System.out.println(sumAges);
}
/**
* 排序
*/
@Test
public void streamSort(){
/**
* 按照年龄从小到达排序(常规操纵)
*/
List<User> userMap = userList.stream().sorted((user1,user2) -> {return user1.getAge() - user2.getAge();}).collect(Collectors.toList());
userMap.stream().forEach(System.out::println);
}
/**
* 排序
*/
@Test
public void streamSort1(){
/**
* 除了上面常规的排序外,
* 我们也可以在sorted通过函数式处理
*/
//默认从小到大
// List<User> userMap = userList.stream().sorted(Comparator.comparing(User::getAge)).collect(Collectors.toList());
//从大到小
List<User> userMap = userList.stream().sorted(Comparator.comparing(User::getAge).reversed()).collect(Collectors.toList());
userMap.stream().forEach(System.out::println);
}
/**
* 统计
*/
//@Test
public void streamCollect(){
/**
* 实际当中我们需要聚合操作,比如将该示例中,将年龄相同的用户分组
* 其实就是需要构造一个Map<Integer,List<User>>的数组结构,这个时候
* 可以使用stream的collect中的分组操作
*/
Map<Integer,List<User>> userMap = userList.stream().collect(Collectors.groupingBy(User::getAge));
userMap.keySet().stream().forEach((age) -> {
System.out.println(age);
System.out.println(Arrays.toString(userMap.get(age).toArray()));
});
}
/**
* 统计
*/
//@Test
public void streamCollect1(){
/**
* 工作中,有时候需要将某个集合中的属性,构造成一个集合
* 比如本例中,需要将age属性构造成一个list<Integer>
*/
List<Integer> ages = userList.stream().map(User::getAge).collect(Collectors.toList());
System.out.println(Arrays.toString(ages.toArray()));
}
private class User {
private String userName;
private int age;
public User(String userName, int age) {
this.userName = userName;
this.age = age;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString(){
return this.getUserName() + ";" + this.getAge();
}
}
}