All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.moon.core.enums.Arrays2 Maven / Gradle / Ivy

package com.moon.core.enums;

import com.moon.core.lang.BooleanUtil;
import com.moon.core.util.IteratorUtil;
import com.moon.core.util.function.BiIntConsumer;

import java.util.HashMap;
import java.util.Iterator;

import static com.moon.core.lang.JoinerUtil.join;
import static com.moon.core.util.IteratorUtil.of;

/**
 * @author moonsky
 */
public enum Arrays2 implements ArrayOperator {
    /**
     * 普通数组
     */
    OBJECTS(new Object[0]) {
        @Override
        public Object apply(int value) { return new Object[value]; }

        @Override
        public Object[] to(Object o) { return (Object[]) o; }

        @Override
        public Iterator iterator(Object o) { return of(to(o)); }

        @Override
        public String stringify(Object o) { return join(to(o), getJoinOn()); }

        @Override
        public boolean test(Object data) { return data instanceof Object[]; }

        @Override
        public Object get(Object arr, int index) { return to(arr)[index]; }

        @Override
        public Object set(Object arr, int index, Object value) {
            Object[] data = to(arr);
            Object old = data[index];
            data[index] = value;
            return old;
        }

        @Override
        public Object[] create(int length) { return new Object[length]; }

        @Override
        public int length(Object arr) { return to(arr).length; }

        @Override
        public void forEach(Object arr, BiIntConsumer consumer) {
            IteratorUtil.forEach(to(arr), consumer);
        }

        @Override
        public boolean contains(Object arr, Object item) {
            if (arr == null) {
                return false;
            }
            Object[] data = to(arr);
            int len = data.length;
            if (len == 0) {
                return false;
            }
            if (item == null) {
                for (int i = 0; i < len; i++) {
                    if (data[i] == null) {
                        return true;
                    }
                }
            }
            for (int i = 0; i < len; i++) {
                if (item.equals(data[i])) {
                    return true;
                }
            }
            return false;
        }
    },
    STRINGS(new String[0]) {
        @Override
        public Object apply(int value) { return new String[value]; }

        @Override
        public String[] to(Object o) { return (String[]) o; }

        @Override
        public Iterator iterator(Object o) { return of(to(o)); }

        @Override
        public String stringify(Object o) { return join(to(o), getJoinOn()); }

        @Override
        public boolean test(Object data) { return data instanceof String[]; }

        @Override
        public Object get(Object arr, int index) { return to(arr)[index]; }

        @Override
        public String set(Object arr, int index, Object value) {
            String[] data = to(arr);
            String old = data[index];
            data[index] = value == null ? null : value.toString();
            return old;
        }

        @Override
        public String[] create(int length) { return new String[length]; }

        @Override
        public int length(Object arr) { return to(arr).length; }

        @Override
        public void forEach(Object arr, BiIntConsumer consumer) {
            IteratorUtil.forEach(to(arr), consumer);
        }

        @Override
        public boolean contains(Object arr, Object item) {
            if (arr == null || !(item instanceof String)) {
                return false;
            }
            String[] data = to(arr);
            int len = data.length;
            if (len == 0) {
                return false;
            }
            if (item == null) {
                for (int i = 0; i < len; i++) {
                    if (data[i] == null) {
                        return true;
                    }
                }
            }
            for (int i = 0; i < len; i++) {
                if (item.equals(data[i])) {
                    return true;
                }
            }
            return false;
        }
    },
    BOOLEANS(new boolean[0]) {
        @Override
        public Object apply(int value) { return new boolean[value]; }

        @Override
        public boolean[] to(Object o) { return (boolean[]) o; }

        @Override
        public Boolean[] toObjects(Object arr) {
            if (arr == null) {
                return null;
            }
            boolean[] old = to(arr);
            final int len = old.length;
            Boolean[] now = new Boolean[len];
            for (int i = 0; i < len; i++) {
                now[i] = old[i];
            }
            return now;
        }

        @Override
        public boolean[] toPrimitives(Object arr) {
            if (arr == null) { return null; }
            Boolean[] old = (Boolean[]) arr;
            final int len = old.length;
            boolean[] now = new boolean[len];
            System.arraycopy(arr, 0, now, 0, len);
            return now;
        }

        @Override
        public Iterator iterator(Object o) {
            return of(to(o));
        }

        @Override
        public String stringify(Object o) {
            return join(to(o), getJoinOn());
        }

        @Override
        public boolean test(Object data) {
            return data instanceof boolean[];
        }

        @Override
        public Boolean get(Object arr, int index) {
            return to(arr)[index];
        }

        @Override
        public Boolean set(Object arr, int index, Object value) {
            BooleanUtil.requireTrue(value instanceof Boolean);
            boolean[] data = to(arr);
            boolean old = data[index];
            data[index] = ((Boolean) value).booleanValue();
            return old;
        }

        @Override
        public boolean[] create(int length) {
            return new boolean[length];
        }

        @Override
        public int length(Object arr) {
            return to(arr).length;
        }

        @Override
        public void forEach(Object arr, BiIntConsumer consumer) {
            boolean[] array = to(arr);
            for (int i = 0, length = array.length; i < length; i++) {
                consumer.accept(array[i], i);
            }
        }

        @Override
        public boolean contains(Object arr, Object item) {
            if (arr == null || item == null || !(item instanceof Boolean)) {
                return false;
            }
            boolean[] data = to(arr);
            int len = data.length;
            if (len == 0) {
                return false;
            }
            if ((Boolean) item) {
                for (int i = 0; i < len; i++) {
                    if (data[i]) {
                        return true;
                    }
                }
            } else {
                for (int i = 0; i < len; i++) {
                    if (!data[i]) {
                        return true;
                    }
                }
            }
            return false;
        }
    },
    DOUBLES(new double[0]) {
        @Override
        public Object apply(int value) {
            return new double[value];
        }

        @Override
        public double[] to(Object o) {
            return (double[]) o;
        }

        @Override
        public Double[] toObjects(Object arr) {
            if (arr == null) { return null; }
            final int len = length(arr);
            Double[] now = new Double[len];
            System.arraycopy(arr, 0, now, 0, len);
            return now;
        }

        @Override
        public double[] toPrimitives(Object arr) {
            if (arr == null) {
                return null;
            }
            Double[] old = (Double[]) arr;
            final int len = old.length;
            double[] values = new double[len];
            for (int i = 0; i < len; i++) {
                values[i] = old[i];
            }
            return values;
        }

        @Override
        public Iterator iterator(Object o) {
            return of(to(o));
        }

        @Override
        public String stringify(Object o) {
            return join(to(o), getJoinOn());
        }

        @Override
        public boolean test(Object data) {
            return data instanceof double[];
        }

        @Override
        public Double get(Object arr, int index) {
            return to(arr)[index];
        }

        @Override
        public Double set(Object arr, int index, Object value) {
            BooleanUtil.requireTrue(value instanceof Number);
            double[] data = to(arr);
            double old = data[index];
            data[index] = ((Number) value).doubleValue();
            return old;
        }

        @Override
        public double[] create(int length) { return new double[length]; }

        @Override
        public int length(Object arr) {
            return to(arr).length;
        }

        @Override
        public void forEach(Object arr, BiIntConsumer consumer) {
            double[] array = to(arr);
            for (int i = 0, length = array.length; i < length; i++) {
                consumer.accept(array[i], i);
            }
        }

        @Override
        public boolean contains(Object arr, Object item) {
            if (arr == null || !(item instanceof Double)) {
                return false;
            }
            double[] data = to(arr);
            int len = data.length;
            if (len == 0) {
                return false;
            }
            double value = (Double) item;
            for (int i = 0; i < len; i++) {
                if (data[i] == value) {
                    return true;
                }
            }
            return false;
        }
    },
    FLOATS(new float[0]) {
        @Override
        public Object apply(int value) {
            return new float[value];
        }

        @Override
        public float[] to(Object o) {
            return (float[]) o;
        }

        @Override
        public Float[] toObjects(Object arr) {
            if (arr == null) {
                return null;
            }
            final int len = to(arr).length;
            Float[] now = new Float[len];
            System.arraycopy(arr, 0, now, 0, len);
            return now;
        }

        @Override
        public float[] toPrimitives(Object arr) {
            if (arr == null) {
                return null;
            }
            Float[] old = (Float[]) arr;
            final int len = old.length;
            float[] values = new float[len];
            for (int i = 0; i < len; i++) {
                values[i] = old[i];
            }
            return values;
        }

        @Override
        public Iterator iterator(Object o) {
            return of(to(o));
        }

        @Override
        public String stringify(Object o) {
            return join(to(o), getJoinOn());
        }

        @Override
        public boolean test(Object data) {
            return data instanceof float[];
        }

        @Override
        public Float get(Object arr, int index) {
            return to(arr)[index];
        }

        @Override
        public Float set(Object arr, int index, Object value) {
            BooleanUtil.requireTrue(value instanceof Number);
            float[] data = to(arr);
            float old = data[index];
            data[index] = ((Number) value).floatValue();
            return old;
        }

        @Override
        public float[] create(int length) {
            return new float[length];
        }

        @Override
        public int length(Object arr) {
            return to(arr).length;
        }

        @Override
        public void forEach(Object arr, BiIntConsumer consumer) {
            float[] array = to(arr);
            for (int i = 0, length = array.length; i < length; i++) {
                consumer.accept(array[i], i);
            }
        }

        @Override
        public boolean contains(Object arr, Object item) {
            if (arr == null || !(item instanceof Float)) {
                return false;
            }
            float[] data = to(arr);
            int len = data.length;
            if (len == 0) {
                return false;
            }
            float value = (Float) item;
            for (int i = 0; i < len; i++) {
                if (data[i] == value) {
                    return true;
                }
            }
            return false;
        }
    },
    LONGS(new long[0]) {
        @Override
        public Object apply(int value) {
            return new long[value];
        }

        @Override
        public long[] to(Object o) {
            return (long[]) o;
        }

        @Override
        public Long[] toObjects(Object arr) {
            if (arr == null) { return null; }
            long[] old = to(arr);
            final int len = old.length;
            Long[] now = new Long[len];
            System.arraycopy(arr, 0, now, 0, len);
            return now;
        }

        @Override
        public long[] toPrimitives(Object arr) {
            if (arr == null) {
                return null;
            }
            Long[] old = (Long[]) arr;
            final int len = old.length;
            long[] values = new long[len];
            for (int i = 0; i < len; i++) {
                values[i] = old[i];
            }
            return values;
        }

        @Override
        public Iterator iterator(Object o) {
            return of(to(o));
        }

        @Override
        public String stringify(Object o) {
            return join(to(o), getJoinOn());
        }

        @Override
        public boolean test(Object data) {
            return data instanceof long[];
        }

        @Override
        public Long get(Object arr, int index) {
            return to(arr)[index];
        }

        @Override
        public long[] create(int length) {
            return new long[length];
        }

        @Override
        public Long set(Object arr, int index, Object value) {
            BooleanUtil.requireTrue(value instanceof Number);
            long[] data = to(arr);
            long old = data[index];
            data[index] = ((Number) value).longValue();
            return old;
        }

        @Override
        public int length(Object arr) {
            return to(arr).length;
        }

        @Override
        public void forEach(Object arr, BiIntConsumer consumer) {
            long[] array = to(arr);
            for (int i = 0, length = array.length; i < length; i++) {
                consumer.accept(array[i], i);
            }
        }

        @Override
        public boolean contains(Object arr, Object item) {
            if (arr == null || !(item instanceof Long)) {
                return false;
            }
            long[] data = to(arr);
            int len = data.length;
            if (len == 0) {
                return false;
            }
            long value = (Long) item;
            for (int i = 0; i < len; i++) {
                if (data[i] == value) {
                    return true;
                }
            }
            return false;
        }
    },
    INTS(new int[0]) {
        @Override
        public Object apply(int value) {
            return new int[value];
        }

        @Override
        public int[] to(Object o) {
            return (int[]) o;
        }

        @Override
        public Integer[] toObjects(Object arr) {
            if (arr == null) { return null; }
            int[] old = to(arr);
            final int len = old.length;
            Integer[] now = new Integer[len];
            System.arraycopy(arr, 0, now, 0, len);
            return now;
        }

        @Override
        public int[] toPrimitives(Object arr) {
            if (arr == null) {
                return null;
            }
            Integer[] old = (Integer[]) arr;
            final int len = old.length;
            int[] values = new int[len];
            for (int i = 0; i < len; i++) {
                values[i] = old[i];
            }
            return values;
        }

        @Override
        public Iterator iterator(Object o) {
            return of(to(o));
        }

        @Override
        public String stringify(Object o) {
            return join(to(o), getJoinOn());
        }

        @Override
        public boolean test(Object data) {
            return data instanceof int[];
        }

        @Override
        public Integer get(Object arr, int index) {
            return to(arr)[index];
        }

        @Override
        public Integer set(Object arr, int index, Object value) {
            BooleanUtil.requireTrue(value instanceof Number);
            int[] data = to(arr);
            int old = data[index];
            data[index] = ((Number) value).intValue();
            return old;
        }

        @Override
        public int[] create(int length) {
            return new int[length];
        }

        @Override
        public int length(Object arr) {
            return to(arr).length;
        }

        @Override
        public void forEach(Object arr, BiIntConsumer consumer) {
            int[] array = to(arr);
            for (int i = 0, length = array.length; i < length; i++) {
                consumer.accept(array[i], i);
            }
        }

        @Override
        public boolean contains(Object arr, Object item) {
            if (arr == null || !(item instanceof Integer)) {
                return false;
            }
            int[] data = to(arr);
            int len = data.length;
            if (len == 0) {
                return false;
            }
            int value = (Integer) item;
            for (int i = 0; i < len; i++) {
                if (data[i] == value) {
                    return true;
                }
            }
            return false;
        }
    },
    SHORTS(new short[0]) {
        @Override
        public Object apply(int value) {
            return new short[value];
        }

        @Override
        public short[] to(Object o) {
            return (short[]) o;
        }

        @Override
        public Short[] toObjects(Object arr) {
            if (arr == null) { return null; }
            short[] old = to(arr);
            final int len = old.length;
            Short[] now = new Short[len];
            System.arraycopy(arr, 0, now, 0, len);
            return now;
        }

        @Override
        public short[] toPrimitives(Object arr) {
            if (arr == null) {
                return null;
            }
            Short[] old = (Short[]) arr;
            final int len = old.length;
            short[] values = new short[len];
            for (int i = 0; i < len; i++) {
                values[i] = old[i];
            }
            return values;
        }

        @Override
        public Iterator iterator(Object o) {
            return of(to(o));
        }

        @Override
        public String stringify(Object o) {
            return join(to(o), getJoinOn());
        }

        @Override
        public boolean test(Object data) {
            return data instanceof short[];
        }

        @Override
        public Short get(Object arr, int index) {
            return to(arr)[index];
        }

        @Override
        public Short set(Object arr, int index, Object value) {
            BooleanUtil.requireTrue(value instanceof Number);
            short[] data = to(arr);
            short old = data[index];
            data[index] = ((Number) value).shortValue();
            return old;
        }

        @Override
        public short[] create(int length) {
            return new short[length];
        }

        @Override
        public int length(Object arr) {
            return to(arr).length;
        }

        @Override
        public void forEach(Object arr, BiIntConsumer consumer) {
            short[] array = to(arr);
            for (int i = 0, length = array.length; i < length; i++) {
                consumer.accept(array[i], i);
            }
        }

        @Override
        public boolean contains(Object arr, Object item) {
            if (arr == null || !(item instanceof Short)) {
                return false;
            }
            short[] data = to(arr);
            int len = data.length;
            if (len == 0) {
                return false;
            }
            int value = (Short) item;
            for (int i = 0; i < len; i++) {
                if (data[i] == value) {
                    return true;
                }
            }
            return false;
        }
    },
    BYTES(new byte[0]) {
        @Override
        public Object apply(int value) {
            return new byte[value];
        }

        @Override
        public byte[] to(Object o) {
            return (byte[]) o;
        }

        @Override
        public Byte[] toObjects(Object arr) {
            if (arr == null) {
                return null;
            }
            byte[] old = to(arr);
            final int len = old.length;
            Byte[] now = new Byte[len];
            System.arraycopy(arr, 0, now, 0, len);
            return now;
        }

        @Override
        public byte[] toPrimitives(Object arr) {
            if (arr == null) {
                return null;
            }
            Byte[] old = (Byte[]) arr;
            final int len = old.length;
            byte[] values = new byte[len];
            for (int i = 0; i < len; i++) {
                values[i] = old[i];
            }
            return values;
        }

        @Override
        public Iterator iterator(Object o) {
            return of(to(o));
        }

        @Override
        public String stringify(Object o) {
            return join(to(o), getJoinOn());
        }

        @Override
        public boolean test(Object data) {
            return data instanceof byte[];
        }

        @Override
        public Byte get(Object arr, int index) {
            return to(arr)[index];
        }

        @Override
        public Byte set(Object arr, int index, Object value) {
            BooleanUtil.requireTrue(value instanceof Number);
            byte[] data = to(arr);
            byte old = data[index];
            data[index] = ((Number) value).byteValue();
            return old;
        }

        @Override
        public byte[] create(int length) {
            return new byte[length];
        }

        @Override
        public int length(Object arr) {
            return to(arr).length;
        }

        @Override
        public void forEach(Object arr, BiIntConsumer consumer) {
            byte[] array = to(arr);
            for (int i = 0, length = array.length; i < length; i++) {
                consumer.accept(array[i], i);
            }
        }

        @Override
        public boolean contains(Object arr, Object item) {
            if (arr == null || !(item instanceof Byte)) {
                return false;
            }
            byte[] data = to(arr);
            int len = data.length;
            if (len == 0) {
                return false;
            }
            int value = (Byte) item;
            for (int i = 0; i < len; i++) {
                if (data[i] == value) {
                    return true;
                }
            }
            return false;
        }
    },
    CHARS(new char[0]) {
        @Override
        public Object apply(int value) {
            return new char[value];
        }

        @Override
        public char[] to(Object o) {
            return (char[]) o;
        }

        @Override
        public Character[] toObjects(Object arr) {
            if (arr == null) { return null; }
            char[] old = to(arr);
            final int len = old.length;
            Character[] now = new Character[len];
            System.arraycopy(arr, 0, now, 0, len);
            return now;
        }

        @Override
        public char[] toPrimitives(Object arr) {
            if (arr == null) {
                return null;
            }
            Character[] characters = (Character[]) arr;
            final int len = characters.length;
            char[] chars = new char[len];
            for (int i = 0; i < len; i++) {
                chars[i] = characters[i];
            }
            return chars;
        }

        @Override
        public Iterator iterator(Object o) {
            return of(to(o));
        }

        @Override
        public String stringify(Object o) {
            return o == null ? null : new String(to(o));
        }

        @Override
        public boolean test(Object data) {
            return data instanceof char[];
        }

        @Override
        public Character get(Object arr, int index) {
            return to(arr)[index];
        }

        @Override
        public Character set(Object arr, int index, Object value) {
            BooleanUtil.requireTrue(value instanceof Character);
            char[] data = to(arr);
            char old = data[index];
            data[index] = (Character) value;
            return old;
        }

        @Override
        public char[] create(int length) {
            return new char[length];
        }

        @Override
        public int length(Object arr) {
            return to(arr).length;
        }

        @Override
        public void forEach(Object arr, BiIntConsumer consumer) {
            char[] array = to(arr);
            for (int i = 0, length = array.length; i < length; i++) {
                consumer.accept(array[i], i);
            }
        }

        @Override
        public boolean contains(Object arr, Object item) {
            if (arr == null || item == null || !(item instanceof Character)) {
                return false;
            }
            char[] data = to(arr);
            int len = data.length;
            if (len == 0) {
                return false;
            }
            char value = (Character) item;
            for (int i = 0; i < len; i++) {
                if (data[i] == value) {
                    return true;
                }
            }
            return false;
        }
    };

    static class Cached {

        final static HashMap CACHE = new HashMap<>();
    }

    public final Class TYPE;
    private final Object EMPTY;

    Arrays2(Object empty) {
        Cached.CACHE.put(TYPE = (this.EMPTY = empty).getClass(), this);
    }

    abstract  T to(Object o);

    private final static String getJoinOn() { return Const.EMPTY; }

    @Override
    public  T empty() {
        return (T) EMPTY;
    }

    public static ArrayOperator get(Class type) {
        return Cached.CACHE.get(type);
    }

    public static ArrayOperator getOrDefault(Class type, ArrayOperator defaultVal) {
        BooleanUtil.requireTrue(type.isArray());
        return Cached.CACHE.getOrDefault(type, defaultVal);
    }

    public static ArrayOperator getOrObjects(Class type) {
        return getOrDefault(type, OBJECTS);
    }

    public static ArrayOperator getOrDefault(Object array, ArrayOperator defaultType) {
        return getOrDefault(array.getClass(), defaultType);
    }

    public static ArrayOperator getOrObjects(Object array) {
        return getOrObjects(array.getClass());
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy