Java 8 Stream基础操作汇总

📅 2022-11-18 15:54 👁️ 73 💬 0

Java 8 Stream操作汇总

// User实体类    
@Data
public class User {


    /**
     * 姓名
     */
    private String name;


    /**
     * 年龄
     */
    private Integer age;


    /**
     * 性别 1-男 2-女
     */
    private Integer sex;
    
    
    /**
     * 身高
     */
    private Long height;

    /**
     * 体重
     */
    private Double weight;


    /**
     * 体重
     */
    private BigDecimal money;


}
// 获取用户列表
 public static List<User> getUserList() {

        User user1 = new User("小王", 18, 1,180L,60D, BigDecimal.valueOf(2000L));
        User user2 = new User("小红", 17, 2,170L,55D, BigDecimal.valueOf(1000L));
        User user3 = new User("小张", 19, 1,160L,50D, BigDecimal.valueOf(3000L));
        User user4 = new User("小蓝", 16, 2,150L,51D, BigDecimal.valueOf(4000L));
        return new ArrayList<>(Arrays.asList(user1, user2, user3, user4));
 }

1.分组

要求:按性别分组

List<User> userList = getUserList();
Map<Integer, List<User>> collect = userList.stream()
    .filter(e -> e.getSex() != null)
    .collect(Collectors.groupingBy(User::getSex));
     .collect(Collectors.groupingBy(User::getSex, Collectors.counting()));
/**
Result:	key=1 value=[user1,user3]
	key=2 value=[user2,user4]
**/

注意:分组字段(sex)不能为null,如果存在null会出现:element cannot be mapped to a null key错误

2.分组统计

要求:统计不同性别人员个数

 Map<Integer, Long> collect1 = userList.stream()
     .filter(e -> e.getSex() != null)
     .collect(Collectors.groupingBy(User::getSex, Collectors.counting()));
/**
Result:	key=1 value=2
		key=2 value=2
**/

// 分组后 取时间最新的一条数据
List<MemberSolutionVo> list = new ArrayList<>();

Map<String, MemberSolutionVo> collect = list.stream().collect(
                    Collectors.groupingBy(MemberSolutionVo::getUuid,
                            Collectors.collectingAndThen(Collectors.reducing((c1, c2) -> c1.getSolutionId().intValue() > c2.getSolutionId().intValue() ? c1 : c2),
                                    Optional::get)));
list = new ArrayList<>(collect.values());

3.分组求和

要求:统计不同性别人员年龄之和

Map<Integer, Integer> collect = userList.stream()
    .filter(e -> e.getSex() != null)
    .collect(Collectors.groupingBy(User::getSex, Collectors.summingInt(User::getAge)));
/**
Result:	key=1 value=37
	key=2 value=33
**/

注意:

  1. 分组求和时,所调用的方法与求和字段有关,如 年龄字段类型为Integer,对应Collectors.summingInt(User::getAge)
Integer 类型	==> Collectors.summingInt(User::getAge)
Double 类型	==>	Collectors.summingDouble(User::getWeight)
Long 类型		==> Collectors.summingLong(User::getHeight)
Bigdecimal 类型	==> Collectors.reducing(BigDecimal.ZERO, User::getMoney, BigDecimal::add)
eg.	userList.stream()
    .filter(e -> e.getSex() != null)
    .collect(Collectors.groupingBy(User::getMoney, Collectors.reducing(BigDecimal.ZERO, User::getMoney, BigDecimal::add)));

4.最大最小值

要求:查询年龄最大最小的用户

// 最大
User user = userList.stream().max(Comparator.comparingInt(User::getAge)).get();
// 最小
User user = userList.stream().min(Comparator.comparingInt(User::getAge)).get();

5.排序

要求:按年龄排序

// sort默认为升序(从小到大)
List<User> collect = userList.stream().sorted(Comparator.comparing(User::getAge)).collect(Collectors.toList());

// 降序排序
List<User> collect = userList.stream()
    .sorted(Comparator.comparing(User::getAgeCollections.reverseOrder()))
    .collect(Collectors.toList());
// 多条件排序
 List<User> collect= userList.stream().sorted(Comparator.comparing(User::getAge, Collections.reverseOrder())
                .thenComparing(User::getName, Collections.reverseOrder())
                .thenComparing(User::getHeight, Collections.reverseOrder())).collect(Collectors.toList());

6.交集

要求:两个用户列表中 姓名相同的用户

anyMathch:集合中,只有一个匹配 就返回true,否则返回false

public static List<User> getUserList1() {

    User user1 = new User("小王", 18, 1,180L,60D, BigDecimal.valueOf(2000L));
    User user2 = new User("小红", 16, 2,170L,55D, BigDecimal.valueOf(1000L));
    User user3 = new User("小张", 19, 1,160L,50D, BigDecimal.valueOf(3000L));
    User user4 = new User("小蓝", 16, 2,150L,51D, BigDecimal.valueOf(4000L));
    return new ArrayList<>(Arrays.asList(user1, user2, user3, user4));
}

public static List<User> getUserList2() {

    User user1 = new User("小王", 18, 1,180L,60D, BigDecimal.valueOf(2000L));
    User user2 = new User("小蓝", 16, 2,170L,55D, BigDecimal.valueOf(1000L));
    return new ArrayList<>(Arrays.asList(user1, user2));
}


List<User> userList1 = getUserList1();
List<User> userList2 = getUserList2();
List<User> collect1 = userList1.stream()
    .filter(u1 ->
            userList2.stream().anyMatch(u2 -> u2.getName().equals(u1.getName()))
           )
    .collect(Collectors.toList());

7.对象集合去重

根据对象中的某个字段去重

ArrayList<User> collect = 
    userList1.stream()
    .collect(
    	Collectors.collectingAndThen(
           		Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(User::getName))), ArrayList::new));

8.差集

   List<User> collect = userList1.stream().filter(u1 ->
            userList2.stream().noneMatch(u2 -> u2.getName().equals(u1.getName()))
        ).collect(Collectors.toList());

9.List转Map

     // key=id  value=name
     Map<String, String> collect= userList1.stream().collect(Collectors.toMap(User::getId,User::getName));
    
     Map<String, String> collect1= userList1.stream().collect(Collectors.toMap(user-> {
            return user.getCode() + "/" + user.getBriefName();  //(Id1+Id2)作为key
        }, v1 -> Func.toStr(v1.getId())));
登录后才能查看或发表评论, 立即 登录
点击右上角即可分享
微信分享提示