java8部分操作记录

这篇博客探讨了Java集合框架的多种操作,包括List的分组、去重、转换为Map,以及排序和过滤等。同时,文章介绍了Stream API的用法,如收集、映射、过滤和聚合操作,展示了如何高效地处理数据。此外,还涉及了如何通过Stream进行分组求最大值和求和等复杂操作。
摘要由CSDN通过智能技术生成

准备model类,生成list添加数据备用

public class TestModel {
    private String id;
    private String name;
    private Integer age;

list部分操作

//list分组转map
Map<Integer, List<TestModel>> collect1 = list.stream()
        .collect(Collectors.groupingBy(TestModel::getAge));
collect1.forEach((k,v) -> System.out.print(k + ":" + v + ";"));

//list转map时去重: 使用(k1,k2) -> k1设置key重复时保留前一个
Map<Integer, TestModel> collect2 = list.stream()
        .collect(Collectors.toMap(TestModel::getAge,a -> a, (k1,k2) -> k1));
collect2.forEach((k,v) -> System.out.print(k + ":" + v + ";"));

//list转map取某个字段
Map<Integer, String> collect21 = list.stream()
        .collect(Collectors.toMap(TestModel::getAge,TestModel::getName));
collect21.forEach((k,v) -> System.out.print(k + ":" + v + ";"));

//list转map:当k或者v可能为空值时
Map<Integer, String> collect22 = list.stream().collect(HashMap::new,
        (k, v) -> k.put(v.getAge(), v.getName()), HashMap::putAll);
collect22.forEach((k,v) -> System.out.print(k + ":" + v + ";"));

//根据部分字段去重
List<TestModel> collect3 = list.stream().collect(Collectors.collectingAndThen(
        Collectors.toCollection(() -> new TreeSet<>(
                Comparator.comparing(o -> (o.getName() + o.getAge())))),
        ArrayList::new
));
collect3.forEach(System.out::println);

//取某字段集合
List<String> collect4 = list.stream().map(TestModel::getName).collect(Collectors.toList());
collect4.forEach(System.out::println);

//移除姓名为空的
list.removeIf(o -> null == o.getName());

//过滤
List<TestModel> collect5 = list.stream().filter(t -> t.getAge() < 26)
        .collect(Collectors.toList());
collect5.forEach(System.out::println);

//排序:不能为null
list.sort(Comparator.comparing(TestModel::getAge).reversed());
//排序时指定null的位置
list.sort(Comparator.comparing(TestModel::getAge,Comparator.nullsFirst(Integer::compare)));
list.sort(Comparator.comparing(TestModel::getAge,Comparator.nullsLast(Integer::compare)));

//按指定顺序排序:如一个正序一个倒序
list.stream().sorted(Comparator.comparing(User::name,Comparator.reverseOrder()).thenComparing(User::age,Comparator.reverseOrder())); 


//最大最小
Optional<TestModel> max = list.stream().filter(t -> null != t.getAge())
        .max(Comparator.comparing(TestModel::getAge));
max.ifPresent(System.out::println);

//求和
Integer reduce = list.stream().map(TestModel::getAge)
        .filter(Objects::nonNull).reduce(0, Integer::sum);
System.out.println(reduce);

//分组求和
Map<Long, Long> childMap = boxUnreadNumbers.stream()
                    .filter(o -> null != o.getParentBoxId())
                    .collect(Collectors.groupingBy(UserResult::getParentBoxId, Collectors.summingLong(UserResult::getNumber)));

//字符串转字符串数组,再转Long列表
List<Long> whiteList = Arrays.stream(stringList.split(","))
				.map(s -> Long.parseLong(s.trim()))
				.collect(Collectors.toList());

//取某个字段使用指定符号拼接,这里id需要转换成字符串
String ids = list.stream().filter(i -> null != i.getLeagueStoreId())
				.map(a -> a.getId() + "")
				.collect(Collectors.joining("|"));
//也可以先取出集合,再拼接
Set<Long> idsSet = list.stream().map(InvitationDTO::getId).collect(Collectors.toSet());
String ids = idsSet.stream().map(i -> i + "").collect(Collectors.joining("|"));

分组求最大值

        List<TestModel> list = new ArrayList<>();
        list.add(TestModel.builder().id(1).name("a").build());
        list.add(TestModel.builder().id(2).name("b").build());
        list.add(TestModel.builder().id(2).name("c").build());
        list.add(TestModel.builder().id(3).name("a").build());
        list.add(TestModel.builder().id(4).name("c").build());
        list.add(TestModel.builder().id(5).name("a").build());
        list.add(TestModel.builder().id(1).name("a").build());

        Map<String, TestModel> collect = list.stream()
                .collect(Collectors.toMap(TestModel::getName, Function.identity(), 
                        (c1, c2) -> c1.getId().compareTo(c2.getId()) >= 0 ? c1 : c2));
        collect.forEach((k, v) -> System.out.println(k + ":" + v));
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

崔丝塔娜炮手

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值