Java ArrayList Filter Sorted Map

作者: 莱姆船长 | 来源:发表于2020-02-14 16:30 被阅读0次
    • 创建一个 ArrayList 的父类
    import java.util.ArrayList;
    
    public class LGFArrayList<O> extends ArrayList<O> {
    
        // 接口部分, 用法可参考 ES6
        public interface mapI<O, T> { T map(O obj); }
        public interface filterI<O> { Boolean filter(O obj); }
        public interface sortedI<O> { Boolean sorted(O obj1, O obj2); }
        public interface findI<O> { Boolean find(O obj); }
        public interface everyI<O> { Boolean every(O obj); }
        public interface someI<O> { Boolean some(O obj); }
    
        /**
         * 过滤语法糖
         * @param I 返回一个 bool 值,用来决定过滤条件
         * @return 返回一个新初始化的过滤后的 ArrayList(新地址)
         */
        public LGFArrayList<O> lgf_Filter(filterI<O> I) {
            LGFArrayList<O> currentList = new LGFArrayList<>();
            for (O obj : this) {
                if (I.filter(obj)) {
                    currentList.add(obj);
                }
            }
            return currentList;
        }
    
        /**
         * map 重构语法糖
         * @param I 返回一个新的元素
         * @param <T> 返回新重构 ArrayList 的泛型类型
         * @return 返回一个新初始化的 ArrayList(新地址)
         */
        public <T> LGFArrayList<T> lgf_Map(mapI<O, T> I) {
            LGFArrayList<T> list = new LGFArrayList<>();
            for (O obj : this) {
                T new_obj = I.map(obj);
                list.add(new_obj);
            }
            return list;
        }
    
        /**
         * find 查找第一次满足条件元素语法糖
         * @param I 返回一个 bool 值,用来决定查找条件
         * @return 第一次满足条件元素
         */
        public O lgf_Find(findI<O> I) {
            for (O obj : this) {
                if (I.find(obj)) {
                    return obj;
                }
            }
            return null;
        }
    
        /**
         * every 回调条件都返回 true 则返回 true
         * @param I 返回一个 bool 值,用来决定条件
         * @return 布尔值
         */
        public Boolean lgf_Every(everyI<O> I) {
            for (O obj : this) {
                if (!I.every(obj)) {
                    return false;
                }
            }
            return true;
        }
    
        /**
         * some 回调条件一个返回 true 则返回 true
         * @param I 返回一个 bool 值,用来决定条件
         * @return 布尔值
         */
        public Boolean lgf_Some(someI<O> I) {
            for (O obj : this) {
                if (I.some(obj)) {
                    return true;
                }
            }
            return false;
        }
    
        /**
         * 快排语法糖
         * @param I 返回一个 bool 值,用来决定排序条件
         * @return 返回排序后的本体
         */
        public LGFArrayList<O> lgf_Sorted(sortedI<O> I) {
            quickSort(this, 0, this.size() - 1, I);
            return this;
        }
        private void quickSort(LGFArrayList<O> arr, int low, int high, sortedI<O> I){
            int i, j;
            O temp, t;
            if (low > high){ return; }
            i = low;
            j = high;
            temp = arr.get(low);
            while (i < j) {
                while ((temp == arr.get(j) || I.sorted(temp, arr.get(j))) && i < j) { j--; }
                while ((temp == arr.get(i) || !I.sorted(temp, arr.get(i))) && i < j) { i++; }
                if (i < j) {
                    t = arr.get(j);
                    arr.set(j, arr.get(i));
                    arr.set(i, t);
                }
            }
            arr.set(low, arr.get(i));
            arr.set(i, temp);
            quickSort(arr, low, j - 1, I);
            quickSort(arr, j + 1, high, I);
        }
    
    }
    
    
    • 不使用(CGLIB, ASM)等运行时工具,仅支持继承后使用,对于前端1000条以内的数据处理,可以有效提升代码可读性
    public class LGFTest {
    
        LGFArrayList<Integer> testArray;
    
        public void Test() {
            testArray = new LGFArrayList<>();
            testArray.addAll(Arrays.asList(1, 2, 3, 4, 5, 6));
    
            // 1, 2, 3, 4, 5, 6
    
            testArray = testArray.lgf_Filter(new LGFArrayList.filterI<Integer>() {
                @Override
                public Boolean filter(Integer obj) {
                    return obj != 4 && obj != 3;
                }
            });
    
            // 1, 2, 5, 6
    
            testArray.lgf_Sorted(new LGFArrayList.sortedI<Integer>() {
                @Override
                public Boolean sorted(Integer obj1, Integer obj2) {
                    return obj1 > obj2;
                }
            });
    
            // 6, 5, 2, 1
    
            testArray = testArray.lgf_Map(new LGFArrayList.mapI<Integer, Integer>() {
                @Override
                public Integer map(Integer obj) {
                    return obj * 2;
                }
            });
    
            // 12, 10, 4, 2
    
            boolean everyHave = testArray.lgf_Every(new LGFArrayList.everyI<Integer>() {
                @Override
                public Boolean every(Integer obj) {
                    return obj == 2 || obj == 4 || obj == 10 || obj == 12;
                }
            });
    
            // true
    
            boolean someHave = testArray.lgf_Some(new LGFArrayList.someI<Integer>() {
                @Override
                public Boolean some(Integer obj) {
                    return obj == 2;
                }
            });
    
            // true
    
            LGFArrayList<String> stringArray = testArray.lgf_Map(new LGFArrayList.mapI<Integer, String>() {
                @Override
                public String map(Integer obj) {
                    return obj.toString();
                }
            });
    
            // "12", "10", "4", "2"
    
            String find_obj = stringArray.lgf_Find(new LGFArrayList.findI<String>() {
                @Override
                public Boolean find(String obj) {
                    return obj.equals("10");
                }
            });
    
            // "10"
    
            System.out.print(testArray);
        }
    
     }
    
    

    相关文章

      网友评论

        本文标题:Java ArrayList Filter Sorted Map

        本文链接:https://www.haomeiwen.com/subject/mkxjfhtx.html