List 实体 根据数组顺序写入Excel

博主在项目中遇到Excel导出问题,要求按表头顺序写入List<Entity>数据。虽需求改变未使用,但记录了朋友提供的类似功能算法,如将 [ A, B, C ] 和 [ B => 1, C => 2, A => 3 ] 转换为 [3, 1, 2] 的结构,以备后续使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近在项目中遇到个导出问题,excel格式表头固定,循环这个List<Entity>的时候要求去根据表头的顺序来写入数据,虽然后头需求变了,导致没用到,但还是记录下:

public static void main(String[] args) {
        List<Entity> list = new ArrayList<>();
        Entity  s;
        String[] strArr = {"schoolName", "totalNum", "standardAmount", "totalAmount"};
        Random random = new Random();
        /**
         * 创建10条测试数据
        */
        for (int i = 0; i <10 ; i++) {
            s= new Entity();
            s.setSchoolName("学校名称" + i);
            s.setTotalNum(random.nextInt());
            s.setStandardAmount(random.nextDouble());
            s.setTotalAmount(random.nextDouble());
            list.add(s);
        }
        list.forEach(ss->{
            Field[] fields = ss.getClass().getDeclaredFields();
                for (String s1 : strArr) {
                    for(int i = 0 ; i < fields.length ; i++) {
                        fields[i].setAccessible(true);
                            if(s1.equals(fields[i].getName())){
                                try {
                                    Object ss1 = fields[i].get(ss);
                                    //这里的这个ss1就是根据循环上面自定义的数组以及        
                                    //List<Entity>里的值从List<Entity>中根据数组里循环当前 
                                    //的值而取到的Value,不知道这样说对不对,反正意思是这么个            
                                    //意思
                                    System.out.println(ss1);
                                } catch (IllegalAccessException e) {
                                    e.printStackTrace();
                                }
                            }
                    }
                }
        });
    }

当初在找这个解决办法时,我朋友大神把他项目中类似这样的一个功能算法给了我

大概意思是这样的

[ A, B, C ]
[  B => 1, C => 2, A => 3 ]
需要得到 [3, 1, 2]   这样的结构

 

/**
     * 获取第一个匹配的元素
     * @param collection
     *                  List<实体>
     * @param target
     *                  要匹配的值
     * @param function
     *                  规则怎么从元素中获取参与匹配的值
     * @param <E>
     * @param <R>
     * @return
     */
        public static <E,R> Optional<E> getFirstMatch(@NonNull Collection<E> collection,R target,@NonNull Function<E,R> function){
        for (E item : collection) {
            R value = function.apply(item);
            if(target == null){
                return value == null ? Optional.ofNullable(item) : Optional.empty();
            }else if(target.equals(value)){
                return Optional.ofNullable(item);
            }
        }
        return Optional.empty();
    }

我就觉得这样对我没用,但是可能以后对我有用我就手写下来了

获取全部匹配:

/**
     * 获取全部匹配的元素
     * @param collection
     * @param target
     * @param function
     * @param <E>
     * @param <R>
     * @return
     */
    public static <E,R>List<E> getAllMatch(@NonNull Collection<E> collection,R target,@NonNull Function<E,R> function){
          return collection.stream().filter(item->{
             R value = function.apply(item);
             if(target == null){
                 return value == null;
             }else{
                 return target.equals(value);
             }
          }).collect(Collectors.toList());
    }

 

检查是不是有元素匹配这样的条件:

/**
     * 检查元素
     * @param collection
     * @param target
     * @param function
     * @param <E>
     * @param <R>
     * @return
     */
    public static <E,R>boolean contains (@NonNull Collection<E> collection,R target,@NonNull Function<E,R> function){
        for (E item : collection) {
            R value = function.apply(item);
            if(target == null){
                return value == null;
            }else if(target.equals(value)){
                return true;
            }
        }
        return false;
    }

实现上面例子:

public static void main(String[] args) {
        List<String> list = List.of("A","B","C");
        List<KeyValuePair<String,Integer>> keyValuePairs=List.of(
                new KeyValuePair<>("B",1),
                new KeyValuePair<>("C",2),
                new KeyValuePair<>("A",3)
        );
        list
            .stream()
            .map(item->getFirstMatch(keyValuePairs,item,KeyValuePair::getKey)
                    .map(KeyValuePair::getValue)
                    .orElse(null))
            .forEach(System.out::println);
    }

感觉以后可能用得上,特此记录下,感谢邱大神提供的算法,哈哈哈

他的博客,有兴趣可以去看下

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值