Lambda表达式工具类-日常搬砖

众所周知,jdk8提供的Lambda表达式能帮我极大的精简代码,但是就在我们在实际使用过程中会有一些重复性的代码,比如对于stream来源的空判断处理,今天我就给大家整理了一些工具类,帮助大家更好的使用流
public final class EnhanceStream {

public static <t> List<t> singletonList(T o) {
    return Collections.singletonList(o);
}

/**
 * &#x751F;&#x6210;list
 *
 * @param elements
 *            &#x5143;&#x7D20;
 * @param <t>
 *            &#x6CDB;&#x578B;
 * @return List
 */
@SafeVarargs
public static <t> List<t> toList(T... elements) {
    List<t> list = new ArrayList<>();
    if (Objects.nonNull(elements)) {
        for (T element : elements) {
            if (Objects.nonNull(element)) {
                list.add(element);
            }
        }
    }
    return list;
}

public static <t> void addAll(Collection<t> collection, Collection<t> add) {
    if (isNotEmpty(add)) {
        collection.addAll(add);
    }
}

/**
 * &#x4E24;&#x4E2A;Map&#x8FDB;&#x884C;&#x5408;&#x5E76;
 *
 * @param map
 *            &#x539F;&#x59CB;map
 * @param add
 *            &#x8981;&#x5408;&#x5E76;&#x7684;map
 * @param <k>
 *            key&#x6CDB;&#x578B;
 * @param <v>
 *            &#x503C;&#x6CDB;&#x578B;
 */
public static <k, v> void addAll(Map<k, v> map, Map<k, v> add) {
    if (isNotEmpty(add) && Objects.nonNull(map)) {
        for (Map.Entry<k, v> kvEntry : add.entrySet()) {
            map.put(kvEntry.getKey(), kvEntry.getValue());
        }
    }
}

public static <t> List<t> setToList(Set<t> set) {
    if (EnhanceStream.isNotEmpty(set)) {
        return new ArrayList<>(set);
    } else {
        return EnhanceStream.emptyList();
    }
}

public static boolean isEmpty(final Collection<?> coll) {
    return coll == null || coll.isEmpty();
}

/**
 * Null-safe check if the specified collection is not empty.

 * <p>
 * Null returns false.

 *
 * @param coll
 *            the collection to check, may be null
 * @return true if non-null and non-empty
 * @since 3.2
 */
public static boolean isNotEmpty(final Collection<?> coll) {
    return !isEmpty(coll);
}

public static boolean isEmpty(final Map<?, ?> map) {
    return map == null || map.isEmpty();
}

public static boolean isNotEmpty(final Map<?, ?> map) {
    return !isEmpty(map);
}

/**
 * &#x8FD4;&#x56DE;&#x7A7A;&#x96C6;&#x5408;
 *
 * @param <t>
 *            &#x6CDB;&#x578B;
 * @return List
 */
public static <t> List<t> emptyList() {
    return Collections.emptyList();
}

public static final <k, v> Map<k, v> emptyMap() {
    return Collections.emptyMap();
}

/**
 * &#x8FD4;&#x56DE;&#x7A7A;&#x96C6;&#x5408;
 *
 * @param <t>
 *            &#x6CDB;&#x578B;
 * @return List
 */
public static <t> Set<t> emptySet() {
    return Collections.emptySet();
}

/**
 * &#x53BB;&#x91CD;
 *
 * @param dataSources
 *            &#x6570;&#x636E;
 * @param <t>
 *            &#x6CDB;&#x578B;
 * @return List<t>
 */
public static <t> List<t> distinct(List<t> dataSources) {
    return newStream(dataSources).filter(Objects::nonNull).distinct().collect(Collectors.toList());
}

/**
 * &#x53BB;&#x91CD;
 *
 * @param dataSources
 *            &#x6570;&#x636E;
 * @param <t>
 *            &#x6CDB;&#x578B;
 * @return List<t>
 */
public static <t, r> List<r> distinct(List<t> dataSources, Function<t, r> mapper) {
    List<r> rs = mapToList(dataSources, mapper);
    return newStream(rs).filter(Objects::nonNull).distinct().collect(Collectors.toList());
}

/**
 * &#x53BB;&#x91CD;
 *
 * @param dataSources
 *            &#x6570;&#x636E;
 * @param <t>
 *            &#x6CDB;&#x578B;
 * @return List<t>
 */
public static <t, t1, r> List<r> distinct(List<t> dataSources, Function<t, t1> mapper1, Function<t1, r> mapper2) {
    List<t1> rs = mapToList(dataSources, mapper1);
    return newStream(rs).filter(Objects::nonNull).map(mapper2).distinct().collect(Collectors.toList());
}

/**
 * &#x53BB;&#x91CD;
 *
 * @param dataSources
 *            &#x6570;&#x636E;
 * @param <t>
 *            &#x6CDB;&#x578B;
 * @return List<t>
 */
public static <t, r> List<t> distinctByKey(List<t> dataSources, Function<t, r> mapper) {
    Map<r, t> dismantling = dismantlingFirst(dataSources, mapper);
    return getValues(dismantling);
}

/**
 * &#x4ECE;&#x6D41;&#x4E2D;&#x83B7;&#x53D6;Inter&#x7C7B;&#x578B;&#x6570;&#x636E;,&#x975E;&#x7A7A;&#x5904;&#x7406;&#x540E;,&#x6C42;&#x548C;
 *
 * @param dataStream
 *            &#x539F;&#x59CB;&#x6570;&#x636E;&#x6D41;
 * @param mapper
 *            &#x6307;&#x5B9A;&#x6570;&#x5B57;&#x7C7B;&#x578B;&#x5B57;&#x6BB5;
 * @param <t>
 *            &#x6CDB;&#x578B;
 * @return Integer
 */
public static <t> Integer mapToNonNullIntSum(Stream<t> dataStream, Function<t, integer> mapper) {
    List<integer> integers = mapToList(dataStream, mapper);
    int total = 0;
    for (Integer integer : integers) {
        if (Objects.nonNull(integer)) {
            total += integer;
        }
    }
    return total;
}

/**
 * &#x4ECE;&#x6D41;&#x4E2D;&#x83B7;&#x53D6;Inter&#x7C7B;&#x578B;&#x6570;&#x636E;,&#x975E;&#x7A7A;&#x5904;&#x7406;&#x540E;,&#x6C42;&#x548C;&#xFF08;&#x5982;&#x679C;&#x5143;&#x7D20;&#x4E3A;&#x7A7A;&#xFF0C;&#x5219;&#x8FD4;&#x56DE;&#x7A7A;&#xFF09;
 *
 * @param dataStream
 *            &#x539F;&#x59CB;&#x6570;&#x636E;&#x6D41;
 * @param mapper
 *            &#x6307;&#x5B9A;&#x6570;&#x5B57;&#x7C7B;&#x578B;&#x5B57;&#x6BB5;
 * @param <t>
 *            &#x6CDB;&#x578B;
 * @return Integer
 */
public static <t> Integer mapToNullAbleIntSum(Stream<t> dataStream, Function<t, integer> mapper) {
    List<integer> integers = mapToList(dataStream, mapper);
    int total = 0;
    boolean haveNonNull = false;
    for (Integer integer : integers) {
        if (Objects.nonNull(integer)) {
            haveNonNull = true;
            total += integer;
        }
    }
    return haveNonNull ? total : null;
}

/**
 * &#x4ECE;&#x6D41;&#x4E2D;&#x83B7;&#x53D6;Inter&#x7C7B;&#x578B;&#x6570;&#x636E;,&#x975E;&#x7A7A;&#x5904;&#x7406;&#x540E;,&#x6C42;&#x548C;
 *
 * @param dataStream
 *            &#x539F;&#x59CB;&#x6570;&#x636E;&#x6D41;
 * @param mapper
 *            &#x6307;&#x5B9A;&#x6570;&#x5B57;&#x7C7B;&#x578B;&#x5B57;&#x6BB5;
 * @param <t>
 *            &#x6CDB;&#x578B;
 * @return Integer
 */
public static <t> Long mapToNonNullLongSum(Stream<t> dataStream, Function<t, long> mapper) {
    List<long> longs = mapToList(dataStream, mapper);
    long total = 0;
    for (Long nextLong : longs) {
        if (Objects.nonNull(nextLong)) {
            total += nextLong;
        }
    }
    return total;
}

/**
 * &#x4ECE;&#x6D41;&#x4E2D;&#x83B7;&#x53D6;Inter&#x7C7B;&#x578B;&#x6570;&#x636E;,&#x975E;&#x7A7A;&#x5904;&#x7406;&#x540E;,&#x6C42;&#x548C;
 *
 * @param dataSources
 *            &#x539F;&#x59CB;&#x6570;&#x636E;&#x6E90;
 * @param mapper
 *            &#x6307;&#x5B9A;&#x6570;&#x5B57;&#x7C7B;&#x578B;&#x5B57;&#x6BB5;
 * @param <t>
 *            &#x6CDB;&#x578B;
 * @return Integer
 */
public static <t> Integer mapToNonNullIntSum(List<t> dataSources, Function<t, integer> mapper) {
    return mapToNonNullIntSum(newStream(dataSources), mapper);
}

/**
 * &#x4ECE;&#x6D41;&#x4E2D;&#x83B7;&#x53D6;Inter&#x7C7B;&#x578B;&#x6570;&#x636E;,&#x975E;&#x7A7A;&#x5904;&#x7406;&#x540E;,&#x6C42;&#x548C;&#xFF08;&#x5982;&#x679C;&#x5143;&#x7D20;&#x4E3A;&#x7A7A;&#xFF0C;&#x5219;&#x8FD4;&#x56DE;&#x7A7A;&#xFF09;
 *
 * @param dataSources
 *            &#x539F;&#x59CB;&#x6570;&#x636E;&#x6E90;
 * @param mapper
 *            &#x6307;&#x5B9A;&#x6570;&#x5B57;&#x7C7B;&#x578B;&#x5B57;&#x6BB5;
 * @param <t>
 *            &#x6CDB;&#x578B;
 * @return Integer
 */
public static <t> Integer mapToNullAbleIntSum(List<t> dataSources, Function<t, integer> mapper) {
    return mapToNullAbleIntSum(newStream(dataSources), mapper);
}

/**
 * &#x4ECE;&#x6D41;&#x4E2D;&#x83B7;&#x53D6;Inter&#x7C7B;&#x578B;&#x6570;&#x636E;,&#x975E;&#x7A7A;&#x5904;&#x7406;&#x540E;,&#x6C42;&#x548C;
 *
 * @param dataSources
 *            &#x539F;&#x59CB;&#x6570;&#x636E;&#x6E90;
 * @param mapper
 *            &#x6307;&#x5B9A;&#x6570;&#x5B57;&#x7C7B;&#x578B;&#x5B57;&#x6BB5;
 * @param <t>
 *            &#x6CDB;&#x578B;
 * @return Integer
 */
public static <t> Long mapToNonNullLongSum(List<t> dataSources, Function<t, long> mapper) {
    return mapToNonNullLongSum(newStream(dataSources), mapper);
}

/**
 * &#x4ECE;map&#x4E2D;&#x83B7;&#x53D6;&#x6240;&#x6709;&#x7684;&#x503C;&#x7684;list
 *
 * @param map
 *            Map&#x6570;&#x636E;
 * @param <k>
 *            key&#x6CDB;&#x578B;
 * @param <v>
 *            value&#x6CDB;&#x578B;
 * @return List
 */
public static <k, v> List<v> getValues(Map<k, v> map) {
    if (CollectionUtils.isEmpty(map)) {
        return Collections.emptyList();
    }
    Collection<v> values = map.values();
    return new ArrayList<>(values);
}

/**
 * &#x4ECE;map&#x4E2D;&#x83B7;&#x53D6;&#x6240;&#x6709;&#x7684;&#x503C;&#x7684;list
 *
 * @param map
 *            Map&#x6570;&#x636E;
 * @param <k>
 *            key&#x6CDB;&#x578B;
 * @param <v>
 *            value&#x6CDB;&#x578B;
 * @return List
 */
public static <k, v> Optional<v> getValuesFirst(Map<k, v> map) {
    List<v> values = getValues(map);
    return values.stream().findFirst();
}

/**
 * &#x5982;&#x679C;&#x662F;&#x6570;&#x636E;&#x5206;&#x7EC4;&#x683C;&#x5F0F;key&#x662F;&#x4E00;&#x4E2A;&#xFF0C;value&#x662F;list&#x7684;&#x60C5;&#x51B5;&#xFF0C;&#x53EA;&#x53BB;value&#x4E2D;&#x7684;&#x7B2C;&#x4E00;&#x4E2A;&#x3002;
 *
 * @param map
 *            Map&#x6570;&#x636E;
 * @param <k>
 *            key&#x6CDB;&#x578B;
 * @param <v>
 *            value&#x6CDB;&#x578B;
 * @return List
 */
public static <k, v> List<v> eachGetValueFirst(Map<k, list<v>> map) {
    if (CollectionUtils.isEmpty(map)) {
        return Collections.emptyList();
    }
    List<v> result = new ArrayList<>(map.size());
    for (Map.Entry<k, list<v>> entry : map.entrySet()) {
        if (!CollectionUtils.isEmpty(entry.getValue())) {
            result.add(entry.getValue().get(0));
        }
    }
    return result;
}

/**
 * &#x4ECE;map&#x4E2D;&#x83B7;&#x53D6;&#x6240;&#x6709;&#x7684;key&#x7684;list
 *
 * @param map
 *            Map&#x6570;&#x636E;
 * @param <k>
 *            key&#x6CDB;&#x578B;
 * @param <v>
 *            value&#x6CDB;&#x578B;
 * @return List
 */
public static <k, v> List<k> getKeys(Map<k, v> map) {
    if (CollectionUtils.isEmpty(map)) {
        return Collections.emptyList();
    }
    Set<k> ks = map.keySet();
    return new ArrayList<>(ks);
}

/**
 * &#x4ECE;&#x6D41;&#x4E2D;&#x5EFA;&#x7ACB;&#x65B0;&#x7684;&#x7C7B;&#x578B;
 *
 * @param dataStream
 *            &#x6570;&#x636E;&#x6D41;
 * @param mapping
 *            &#x8F6C;&#x6362;&#x51FD;&#x6570;
 * @param <t>
 *            &#x539F;&#x6570;&#x636E;&#x7C7B;&#x578B;
 * @param <r>
 *            &#x76EE;&#x6807;&#x6570;&#x636E;&#x7C7B;&#x578B;
 * @return List
 */
public static <t, r> List<r> mapToList(Stream<t> dataStream, Function<t, r> mapping) {
    return newStream(dataStream).map(mapping).filter(Objects::nonNull).collect(Collectors.toList());
}

/**
 * &#x4ECE;&#x6D41;&#x4E2D;&#x5EFA;&#x7ACB;&#x65B0;&#x7684;&#x7C7B;&#x578B;
 *
 * @param dataSources
 *            &#x6570;&#x636E;&#x6E90;
 * @param mapping
 *            &#x8F6C;&#x6362;&#x51FD;&#x6570;
 * @param <t>
 *            &#x539F;&#x6570;&#x636E;&#x7C7B;&#x578B;
 * @param <r>
 *            &#x76EE;&#x6807;&#x6570;&#x636E;&#x7C7B;&#x578B;
 * @return List
 */
public static <t, r> List<r> mapToList(List<t> dataSources, Function<t, r> mapping) {
    return newStream(dataSources).map(mapping).filter(Objects::nonNull).collect(Collectors.toList());
}

/**
 * &#x4ECE;&#x6D41;&#x4E2D;&#x5EFA;&#x7ACB;&#x65B0;&#x7684;&#x7C7B;&#x578B;
 *
 * @param dataSources
 *            &#x6570;&#x636E;&#x6E90;
 * @param mapping
 *            &#x8F6C;&#x6362;&#x51FD;&#x6570;
 * @param <t>
 *            &#x539F;&#x6570;&#x636E;&#x7C7B;&#x578B;
 * @param <r>
 *            &#x76EE;&#x6807;&#x6570;&#x636E;&#x7C7B;&#x578B;
 * @return List
 */
public static <t, r> List<r> mapToUniqueList(List<t> dataSources, Function<t, r> mapping) {
    return newStream(dataSources).map(mapping).filter(Objects::nonNull).distinct().collect(Collectors.toList());
}

/**
 * &#x4ECE;&#x6D41;&#x4E2D;&#x5EFA;&#x7ACB;&#x65B0;&#x7684;&#x7C7B;&#x578B;
 *
 * @param dataSources
 *            &#x6570;&#x636E;&#x6E90;
 * @param mapping
 *            &#x8F6C;&#x6362;&#x51FD;&#x6570;
 * @param <t>
 *            &#x539F;&#x6570;&#x636E;&#x7C7B;&#x578B;
 * @param <r>
 *            &#x76EE;&#x6807;&#x6570;&#x636E;&#x7C7B;&#x578B;
 * @return List
 */
public static <t, r1, r> List<r> mapToUniqueList(List<t> dataSources, Function<t, r1> mapping,
    Function<r1, r> mapping1) {
    return newStream(dataSources).map(mapping).filter(Objects::nonNull).map(mapping1).filter(Objects::nonNull)
        .distinct().collect(Collectors.toList());
}

/**
 * &#x4ECE;&#x6D41;&#x4E2D;&#x5EFA;&#x7ACB;&#x65B0;&#x7684;&#x7C7B;&#x578B;
 *
 * @param dataSources
 *            &#x6570;&#x636E;&#x6E90;
 * @param mapping
 *            &#x8F6C;&#x6362;&#x51FD;&#x6570;
 * @param <t>
 *            &#x539F;&#x6570;&#x636E;&#x7C7B;&#x578B;
 * @param <r>
 *            &#x76EE;&#x6807;&#x6570;&#x636E;&#x7C7B;&#x578B;
 * @return List
 */
public static <t, r, v> List<v> supperMapToList(List<t> dataSources, Function<t, r> mapping,
    Function<r, v> mapping2) {
    return newStream(dataSources).map(mapping).filter(Objects::nonNull).map(mapping2).filter(Objects::nonNull)
        .distinct().collect(Collectors.toList());
}

/**
 * &#x5C06;&#x591A;&#x4E2A;list&#x96C6;&#x5408;&#x5408;&#x5E76;&#x6210;&#x4E00;&#x4E2A; &#x5982;&#x679C;&#x8981;&#x4FDD;&#x8BC1;&#x6DFB;&#x52A0;&#x987A;&#x5E8F;&#xFF0C;&#x8BF7;&#x6309;&#x7167;&#x987A;&#x5E8F;&#x6DFB;&#x52A0;
 *
 * @param dataSourceList
 *            &#x6570;&#x636E;&#x6E90;
 * @return List
 */
@SafeVarargs
public static <t> List<t> mergeList(List<t>... dataSourceList) {
    if (Objects.isNull(dataSourceList)) {
        return emptyList();
    }
    List<t> result = new ArrayList<>();
    for (List<t> ts : dataSourceList) {
        if (isNotEmpty(ts)) {
            result.addAll(ts);
        }
    }
    return result;
}

/**
 * &#x4ECE;&#x6D41;&#x4E2D;&#x5EFA;&#x7ACB;&#x65B0;&#x7684;List&#x7C7B;&#x578B;,&#x5E76;&#x5C06;&#x65B0;&#x7684;list
 *
 * @param dataSources
 *            &#x6570;&#x636E;&#x6E90;
 * @param mapping
 *            &#x8F6C;&#x6362;&#x51FD;&#x6570;
 * @param <t>
 *            &#x539F;&#x6570;&#x636E;&#x7C7B;&#x578B;
 * @param <r>
 *            &#x76EE;&#x6807;&#x6570;&#x636E;&#x7C7B;&#x578B;
 * @return List
 */
public static <t, r> List<r> mapToMergeList(List<t> dataSources, Function<t, list<r>> mapping) {
    List<list<r>> collect =
        newStream(dataSources).map(mapping).filter(Objects::nonNull).collect(Collectors.toList());
    List<r> allList = new ArrayList<>();
    for (List<r> rs : collect) {
        allList.addAll(rs);
    }
    return allList;
}

/**
 * &#x4ECE;&#x6D41;&#x4E2D;&#x5EFA;&#x7ACB;&#x65B0;&#x7684;&#x7C7B;&#x578B;
 *
 * @param dataSource
 *            &#x6570;&#x636E;
 * @param mapping
 *            &#x8F6C;&#x6362;&#x51FD;&#x6570;
 * @param <t>
 *            &#x539F;&#x6570;&#x636E;&#x7C7B;&#x578B;
 * @param <r>
 *            &#x76EE;&#x6807;&#x6570;&#x636E;&#x7C7B;&#x578B;
 * @return List
 */
public static <t, r> Set<r> mapToSet(List<t> dataSource, Function<t, r> mapping) {
    return newStream(dataSource).map(mapping).filter(Objects::nonNull).collect(Collectors.toSet());
}

/**
 * &#x4ECE;&#x6D41;&#x4E2D;&#x5EFA;&#x7ACB;&#x65B0;&#x7684;&#x7C7B;&#x578B;
 *
 * @param dataStream
 *            &#x6570;&#x636E;&#x6D41;
 * @param mapping
 *            &#x8F6C;&#x6362;&#x51FD;&#x6570;
 * @param <t>
 *            &#x539F;&#x6570;&#x636E;&#x7C7B;&#x578B;
 * @param <r>
 *            &#x76EE;&#x6807;&#x6570;&#x636E;&#x7C7B;&#x578B;
 * @return List
 */
public static <t, r> Set<r> mapToSet(Stream<t> dataStream, Function<t, r> mapping) {
    return newStream(dataStream).map(mapping).filter(Objects::nonNull).collect(Collectors.toSet());
}

/**
 * &#x4ECE;&#x6D41;&#x4E2D;&#x5EFA;&#x7ACB;&#x65B0;&#x7684;&#x7C7B;&#x578B;&#x5E76;&#x53BB;&#x91CD;
 *
 * @param dataSources
 *            &#x6570;&#x636E;&#x6D41;
 * @param mapping
 *            &#x8F6C;&#x6362;&#x51FD;&#x6570;
 * @param <t>
 *            &#x539F;&#x6570;&#x636E;&#x7C7B;&#x578B;
 * @param <r>
 *            &#x76EE;&#x6807;&#x6570;&#x636E;&#x7C7B;&#x578B;
 * @return List
 */
public static <t, r> List<r> distinctMapToList(List<t> dataSources, Function<t, r> mapping) {
    return newStream(newStream(dataSources)).map(mapping).filter(Objects::nonNull).distinct()
        .collect(Collectors.toList());
}

/**
 * &#x4ECE;&#x6D41;&#x4E2D;&#x5EFA;&#x7ACB;&#x65B0;&#x7684;&#x7C7B;&#x578B;&#x5E76;&#x53BB;&#x91CD;
 *
 * @param dataStream
 *            &#x6570;&#x636E;&#x6D41;
 * @param mapping
 *            &#x8F6C;&#x6362;&#x51FD;&#x6570;
 * @param <t>
 *            &#x539F;&#x6570;&#x636E;&#x7C7B;&#x578B;
 * @param <r>
 *            &#x76EE;&#x6807;&#x6570;&#x636E;&#x7C7B;&#x578B;
 * @return List
 */
public static <t, r> List<r> distinctMapToList(Stream<t> dataStream, Function<t, r> mapping) {
    return newStream(dataStream).map(mapping).filter(Objects::nonNull).distinct().collect(Collectors.toList());
}

/**
 * &#x5BF9;&#x6570;&#x636E;&#x6D41;&#x8FDB;&#x884C;&#x8FC7;&#x6EE4;
 *
 * @param dataStream
 *            &#x6570;&#x636E;&#x6D41;
 * @param predicate
 *            &#x8FC7;&#x6EE4;&#x6761;&#x4EF6;
 * @param exceptionSupplier
 *            &#x5F02;&#x5E38;&#x751F;&#x6210;
 * @param <t>
 *            &#x6570;&#x636E;&#x6CDB;&#x578B;
 * @param <x>
 *            &#x5F02;&#x5E38;&#x6CDB;&#x578B;
 * @return List &#x8FC7;&#x6EE4;&#x540E;&#x7684;&#x6570;&#x636E;&#x6761;&#x4EF6;
 * @throws X
 *             Throwable
 */
public static <t, x extends throwable> T filterSingle(Stream<t> dataStream, Predicate<? super T> predicate,
    Supplier<? extends X> exceptionSupplier) throws X {
    return StreamFilter.filterSingle(newStream(dataStream), predicate, exceptionSupplier);
}

/**
 * &#x8FC7;&#x6EE4;
 *
 * @param dataSource
 *            &#x6570;&#x636E;&#x6E90;
 * @param predicate
 *            &#x8FC7;&#x6EE4;&#x6761;&#x4EF6;
 * @param <t>
 *            &#x6570;&#x636E;&#x6CDB;&#x578B;
 * @return List
 */
public static <t, r> List<t> superFilter(List<t> dataSource, Function<t, r> function,
    Predicate<? super R> predicate) {
    return superFilter(newStream(dataSource), function, predicate);
}

/**
 * &#x6839;&#x636E;&#x6761;&#x4EF6;&#x751F;&#x6210;List&#x96C6;&#x5408;
 *
 * @param dataStream
 *            &#x6570;&#x636E;&#x6D41;
 * @param predicate
 *            &#x8FC7;&#x6EE4;&#x6761;&#x4EF6;
 * @param <t>
 *            &#x6570;&#x636E;&#x6CDB;&#x578B;
 * @return List
 */
public static <t, r> List<t> superFilter(Stream<t> dataStream, Function<t, r> function,
    Predicate<? super R> predicate) {
    List<t> result = new ArrayList<>();
    dataStream.filter(Objects::nonNull).forEach(t -> {
        R apply = function.apply(t);
        if (predicate.test(apply)) {
            result.add(t);
        }
    });
    return result;
}

/**
 * &#x5BF9;&#x6570;&#x636E;&#x6D41;&#x8FDB;&#x884C;&#x8FC7;&#x6EE4;
 *
 * @param dataSource
 *            &#x6570;&#x636E;&#x6E90;&#x5934;
 * @param predicate
 *            &#x8FC7;&#x6EE4;&#x6761;&#x4EF6;
 * @param <t>
 *            &#x6570;&#x636E;&#x6CDB;&#x578B;
 * @return List &#x8FC7;&#x6EE4;&#x540E;&#x7684;&#x6570;&#x636E;&#x6761;&#x4EF6;
 */
public static <t> List<t> filter(List<t> dataSource, Predicate<? super T> predicate) {
    return StreamFilter.filter(newStream(dataSource), predicate);
}

/**
 * &#x5BF9;&#x6570;&#x636E;&#x6D41;&#x8FDB;&#x884C;&#x8FC7;&#x6EE4;
 *
 * @param dataStream
 *            &#x6570;&#x636E;&#x6D41;
 * @param predicate
 *            &#x8FC7;&#x6EE4;&#x6761;&#x4EF6;
 * @param <t>
 *            &#x6570;&#x636E;&#x6CDB;&#x578B;
 * @return List &#x8FC7;&#x6EE4;&#x540E;&#x7684;&#x6570;&#x636E;&#x6761;&#x4EF6;
 */
public static <t> List<t> filter(Stream<t> dataStream, Predicate<? super T> predicate) {
    return StreamFilter.filter(newStream(dataStream), predicate);
}

public static <t, x extends throwable> T findFirst(Stream<t> dataStream, Supplier<? extends X> exceptionSupplier)
    throws X {
    return newStream(dataStream).findFirst().orElseThrow(exceptionSupplier);
}

public static <t> Optional<t> findFirst(Stream<t> dataStream) {
    return newStream(dataStream).findFirst();
}

public static <t> Optional<t> findFirst(List<t> dataList) {
    return newStream(dataList).findFirst();
}

public static <t> Optional<t> findAny(Stream<t> dataStream) {
    return newStream(dataStream).findAny();
}

/**
 * &#x4ECE;&#x6D41;&#x4E2D;&#x83B7;&#x53D6;&#x4EFB;&#x610F;&#x6570;&#x636E;
 *
 * @param dataList
 *            &#x6570;&#x636E;&#x96C6;&#x5408;
 * @param <t>
 *            &#x6CDB;&#x578B;
 * @return Optional
 */
public static <t> Optional<t> findAny(List<t> dataList) {
    return newStream(dataList).findAny();
}

/**
 * &#x4ECE;&#x6D41;&#x4E2D;&#x83B7;&#x53D6;&#x4EFB;&#x610F;&#x6570;&#x636E;
 *
 * @param dataList
 *            &#x6570;&#x636E;&#x96C6;&#x5408;
 * @param <t>
 *            &#x6CDB;&#x578B;
 * @return Optional
 */
public static <t> T findRequiredAny(List<t> dataList) {
    Optional<t> any = newStream(dataList).findAny();
    if (!any.isPresent()) {
        throw new RuntimeException("EnhanceStream.findRequiredAny:"+dataList);
    }
    return any.get();
}

/**
 * &#x5BF9;&#x6570;&#x636E;&#x6D41;&#x8FDB;&#x884C;&#x8FC7;&#x6EE4;,&#x5E76;&#x5BF9;&#x8FC7;&#x6EE4;&#x540E;&#x7684;&#x6570;&#x636E;&#x8FDB;&#x884C;&#x7C7B;&#x578B;&#x8F6C;&#x6362;
 *
 * @param dataStream
 *            &#x6570;&#x636E;&#x6D41;
 * @param predicate
 *            &#x8FC7;&#x6EE4;&#x6761;&#x4EF6;
 * @param applyMapping
 *            &#x6570;&#x636E;&#x8F6C;&#x6362;&#x5668;
 * @param <t>
 *            &#x6570;&#x636E;&#x6CDB;&#x578B;
 * @param <v>
 *            &#x8F6C;&#x6362;&#x540E;&#x7684;&#x6570;&#x636E;&#x7C7B;&#x578B;
 * @return List &#x8FC7;&#x6EE4;&#x540E;&#x7684;&#x6570;&#x636E;&#x6761;&#x4EF6;
 */
public static <t, v> List<v> filter(Stream<t> dataStream, Predicate<? super T> predicate,
    Function<? super T, ? extends V> applyMapping) {
    return StreamFilter.filter(newStream(dataStream), predicate, applyMapping);
}

/**
 * &#x5BF9;&#x6570;&#x636E;&#x6D41;&#x8FDB;&#x884C;&#x5206;&#x7EC4;
 *
 * @param dataStream
 *            &#x6570;&#x636E;&#x6D41;
 * @param keyApply
 *            &#x5206;&#x7EC4;&#x9879;
 * @param <t>
 *            &#x6570;&#x636E;&#x6CDB;&#x578B;
 * @param <k>
 *            &#x5206;&#x7EC4;&#x9879;&#x6CDB;&#x578B;
 * @return Map &#x5206;&#x7EC4;&#x540E;&#x6570;&#x636E;
 */
public static <t, k> Map<k, list<t>> group(Stream<t> dataStream, Function<? super T, ? extends K> keyApply) {
    return StreamBinder.group(newStream(dataStream), keyApply);
}

/**
 * &#x5BF9;&#x6570;&#x636E;&#x6D41;&#x8FDB;&#x884C;&#x5206;&#x7EC4;,&#x5E76;&#x5BF9;&#x5206;&#x7EC4;&#x540E;&#x7684;&#x6570;&#x636E;&#x8FDB;&#x884C;&#x7C7B;&#x578B;&#x8F6C;&#x6362;
 *
 * @param dataStream
 *            &#x6570;&#x636E;&#x6D41;
 * @param keyApply
 *            &#x5206;&#x7EC4;&#x9879;
 * @param valueApply
 *            &#x6570;&#x636E;&#x8F6C;&#x6362;&#x5668;
 * @param <t>
 *            &#x6570;&#x636E;&#x6CDB;&#x578B;
 * @param <k>
 *            &#x5206;&#x7EC4;&#x9879;&#x6CDB;&#x578B;
 * @param <v>
 *            &#x8F6C;&#x6362;&#x540E;&#x7684;&#x6570;&#x636E;&#x7C7B;&#x578B;
 * @return Map &#x5206;&#x7EC4;&#x540E;&#x6570;&#x636E;
 */
public static <t, k, v> Map<k, list<v>> group(Stream<t> dataStream, Function<? super T, ? extends K> keyApply,
    Function<? super T, ? extends V> valueApply) {
    return StreamBinder.group(newStream(dataStream), keyApply, valueApply);
}

/**
 * @param dataSource
 *            &#x5546;&#x54C1;&#x914D;&#x7F6E;
 * @param keyApply
 *            key&#x751F;&#x6210;
 * @param <k>
 *            key&#x6CDB;&#x578B;
 * @param <t>
 *            &#x6570;&#x636E;&#x6E90;&#x6CDB;&#x578B;
 * @return Map<k, v>
 */
public static <k, t> Map<k, t> dismantlingFirst(List<t> dataSource, Function<? super T, ? extends K> keyApply) {
    return StreamBinder.dismantlingFirst(newStream(dataSource), keyApply);
}

/**
 * @param dataSource
 *            &#x5546;&#x54C1;&#x914D;&#x7F6E;
 * @param keyApply
 *            key&#x751F;&#x6210;
 * @param <k>
 *            key&#x6CDB;&#x578B;
 * @param <t>
 *            &#x6570;&#x636E;&#x6E90;&#x6CDB;&#x578B;
 * @return Map<k, v>
 */
public static <k, v,t> Map<k, v> dismantlingFirst(List<t> dataSource, Function<? super T, ? extends K> keyApply,Function<? super T, ? extends V> valueApply) {
    return StreamBinder.dismantlingFirst(newStream(dataSource), keyApply,valueApply);
}

/**
 * @param dataSourceStream
 *            &#x5546;&#x54C1;&#x914D;&#x7F6E;
 * @param keyApply
 *            key&#x751F;&#x6210;
 * @param <k>
 *            key&#x6CDB;&#x578B;
 * @param <t>
 *            &#x6570;&#x636E;&#x6E90;&#x6CDB;&#x578B;
 * @return Map<k, v>
 */
public static <k, t> Map<k, t> dismantlingFirst(Stream<t> dataSourceStream,
    Function<? super T, ? extends K> keyApply) {
    return StreamBinder.dismantlingFirst(dataSourceStream, keyApply);
}

/**
 * &#x6570;&#x636E;&#x62C6;&#x5206;&#x300C;&#x6CE8;&#x610F;: &#x62C6;&#x5206;&#x540E;&#x7684;&#x6570;&#x636E;,&#x5982;&#x679C;Key&#x4E00;&#x6837;&#x4F1A;&#x4EA7;&#x751F;&#x5F02;&#x5E38;,&#x8BF7;&#x8C28;&#x614E;&#x4F7F;&#x7528;
 *
 * @param dataStream
 *            &#x6570;&#x636E;&#x6D41;
 * @param keyApply
 *            Key&#x8F6C;&#x6362;&#x5668;
 * @param <t>
 *            &#x539F;&#x59CB;&#x6570;&#x636E;&#x6CDB;&#x578B;
 * @param <k>
 *            Key&#x6CDB;&#x578B;
 * @return Map &#x62C6;&#x5206;&#x540E;&#x6570;&#x636E;
 */
public static <t, k> Map<k, t> dismantling(List<t> dataStream, Function<? super T, ? extends K> keyApply) {
    return StreamBinder.dismantling(newStream(dataStream), keyApply);
}

/**
 * &#x6570;&#x636E;&#x62C6;&#x5206;&#x300C;&#x6CE8;&#x610F;: &#x62C6;&#x5206;&#x540E;&#x7684;&#x6570;&#x636E;,&#x5982;&#x679C;Key&#x4E00;&#x6837;&#x4F1A;&#x4EA7;&#x751F;&#x5F02;&#x5E38;,&#x8BF7;&#x8C28;&#x614E;&#x4F7F;&#x7528;
 *
 * @param dataStream
 *            &#x6570;&#x636E;&#x6D41;
 * @param keyApply
 *            Key&#x8F6C;&#x6362;&#x5668;
 * @param <t>
 *            &#x539F;&#x59CB;&#x6570;&#x636E;&#x6CDB;&#x578B;
 * @param <k>
 *            Key&#x6CDB;&#x578B;
 * @return Map &#x62C6;&#x5206;&#x540E;&#x6570;&#x636E;
 */
public static <t, k> Map<k, t> dismantling(Stream<t> dataStream, Function<? super T, ? extends K> keyApply) {
    return StreamBinder.dismantling(newStream(dataStream), keyApply);
}

/**
 * &#x6570;&#x636E;&#x62C6;&#x5206;&#x300C;&#x6CE8;&#x610F;: &#x62C6;&#x5206;&#x540E;&#x7684;&#x6570;&#x636E;,&#x5982;&#x679C;Key&#x4E00;&#x6837;&#x4F1A;&#x4EA7;&#x751F;&#x5F02;&#x5E38;,&#x8BF7;&#x8C28;&#x614E;&#x4F7F;&#x7528;
 *
 * @param dataSource
 *            &#x6570;&#x636E;&#x6E90;
 * @param keyApply
 *            Key&#x8F6C;&#x6362;&#x5668;
 * @param <t>
 *            &#x539F;&#x59CB;&#x6570;&#x636E;&#x6CDB;&#x578B;
 * @param <k>
 *            Key&#x6CDB;&#x578B;
 * @return Map &#x62C6;&#x5206;&#x540E;&#x6570;&#x636E;
 */
public static <t, k, x extends throwable> Map<k, t> dismantling(List<t> dataSource,
    Function<? super T, ? extends K> keyApply, Supplier<? extends X> exceptionSupplier) throws X {
    return StreamBinder.dismantling(newStream(dataSource), keyApply, exceptionSupplier);
}

/**
 * &#x6570;&#x636E;&#x62C6;&#x5206;&#x300C;&#x6CE8;&#x610F;: &#x62C6;&#x5206;&#x540E;&#x7684;&#x6570;&#x636E;,&#x5982;&#x679C;Key&#x4E00;&#x6837;&#x4F1A;&#x4EA7;&#x751F;&#x5F02;&#x5E38;,&#x8BF7;&#x8C28;&#x614E;&#x4F7F;&#x7528;
 *
 * @param dataStream
 *            &#x6570;&#x636E;&#x6D41;
 * @param keyApply
 *            Key&#x8F6C;&#x6362;&#x5668;
 * @param <t>
 *            &#x539F;&#x59CB;&#x6570;&#x636E;&#x6CDB;&#x578B;
 * @param <k>
 *            Key&#x6CDB;&#x578B;
 * @return Map &#x62C6;&#x5206;&#x540E;&#x6570;&#x636E;
 */
public static <t, k, x extends throwable> Map<k, t> dismantling(Stream<t> dataStream,
    Function<? super T, ? extends K> keyApply, Supplier<? extends X> exceptionSupplier) throws X {
    return StreamBinder.dismantling(newStream(dataStream), keyApply, exceptionSupplier);
}

/**
 * &#x6570;&#x636E;&#x62C6;&#x5206;&#x300C;&#x6CE8;&#x610F;: &#x62C6;&#x5206;&#x540E;&#x7684;&#x6570;&#x636E;,&#x5982;&#x679C;Key&#x4E00;&#x6837;&#x4F1A;&#x4EA7;&#x751F;&#x5F02;&#x5E38;,&#x8BF7;&#x8C28;&#x614E;&#x4F7F;&#x7528;
 *
 * @param dataStream
 *            &#x6570;&#x636E;&#x6D41;
 * @param keyApply
 *            Key&#x8F6C;&#x6362;&#x5668;
 * @param valueApply
 *            Value&#x8F6C;&#x6362;&#x5668;
 * @param <t>
 *            &#x539F;&#x59CB;&#x6570;&#x636E;&#x6CDB;&#x578B;
 * @param <k>
 *            Key&#x6CDB;&#x578B;
 * @param <v>
 *            Value&#x6CDB;&#x578B;
 * @return Map &#x62C6;&#x5206;&#x540E;&#x6570;&#x636E;
 */
public static <t, k, v> Map<k, v> dismantling(Stream<t> dataStream, Function<? super T, ? extends K> keyApply,
    Function<? super T, ? extends V> valueApply) {
    return StreamBinder.dismantling(newStream(dataStream), keyApply, valueApply);
}

/**
 * &#x6570;&#x636E;&#x62C6;&#x5206;&#x300C;&#x6CE8;&#x610F;: &#x62C6;&#x5206;&#x540E;&#x7684;&#x6570;&#x636E;,&#x5982;&#x679C;Key&#x4E00;&#x6837;&#x4F1A;&#x4EA7;&#x751F;&#x5F02;&#x5E38;,&#x8BF7;&#x8C28;&#x614E;&#x4F7F;&#x7528;
 *
 * @param dataStream
 *            &#x6570;&#x636E;&#x6D41;
 * @param keyApply
 *            Key&#x8F6C;&#x6362;&#x5668;
 * @param valueApply
 *            Value&#x8F6C;&#x6362;&#x5668;
 * @param <t>
 *            &#x539F;&#x59CB;&#x6570;&#x636E;&#x6CDB;&#x578B;
 * @param <k>
 *            Key&#x6CDB;&#x578B;
 * @param <v>
 *            Value&#x6CDB;&#x578B;
 * @param <x>
 *            &#x6570;&#x636E;&#x91CD;&#x590D;&#x4EA7;&#x751F;&#x7684;&#x5F02;&#x5E38;&#x63CF;&#x8FF0;
 * @return Map &#x62C6;&#x5206;&#x540E;&#x6570;&#x636E;
 */
public static <t, k, v, x extends throwable> Map<k, v> dismantling(Stream<t> dataStream,
    Function<? super T, ? extends K> keyApply, Function<? super T, ? extends V> valueApply,
    Supplier<? extends X> exceptionSupplier) throws X {
    return StreamBinder.dismantling(newStream(dataStream), keyApply, valueApply, exceptionSupplier);
}

private static <t> Stream<t> newStream(Stream<t> dataSourcesStream) {
    if (dataSourcesStream == null) {
        return Stream.empty();
    }
    return dataSourcesStream;
}

public static <t> Stream<t> newStream(List<t> dataSources) {
    if (dataSources == null) {
        return Stream.empty();
    }
    return dataSources.stream();
}

/**
 * &#x5BF9;&#x6570;&#x636E;&#x6D41;&#x8FDB;&#x884C;&#x8FC7;&#x6EE4;,&#x5E76;&#x5BF9;&#x8FC7;&#x6EE4;&#x540E;&#x7684;&#x6570;&#x636E;&#x8FDB;&#x884C;&#x7C7B;&#x578B;&#x8F6C;&#x6362;
 *
 * @param dataSources
 *            &#x539F;&#x59CB;&#x6570;&#x636E;&#x6D41;
 * @param predicate
 *            &#x8FC7;&#x6EE4;&#x6761;&#x4EF6;
 * @param applyMapping
 *            &#x6570;&#x636E;&#x8F6C;&#x6362;&#x5668;
 * @param <v>
 *            &#x8F6C;&#x6362;&#x540E;&#x7684;&#x6570;&#x636E;&#x7C7B;&#x578B;
 * @param <t>
 *            &#x539F;&#x59CB;&#x6570;&#x636E;&#x7C7B;&#x578B;
 * @return List &#x8FC7;&#x6EE4;&#x540E;&#x7684;&#x6570;&#x636E;&#x6761;&#x4EF6;
 */
public static <t, v> List<v> filter(List<t> dataSources, Predicate<? super T> predicate,
    Function<? super T, ? extends V> applyMapping) {
    return StreamFilter.filter(newStream(dataSources), predicate, applyMapping);
}

/**
 * &#x6570;&#x636E;&#x62C6;&#x5206;&#x300C;&#x6CE8;&#x610F;: &#x62C6;&#x5206;&#x540E;&#x7684;&#x6570;&#x636E;,&#x5982;&#x679C;Key&#x4E00;&#x6837;&#x4F1A;&#x4EA7;&#x751F;&#x5F02;&#x5E38;,&#x8BF7;&#x8C28;&#x614E;&#x4F7F;&#x7528;
 *
 * @param dataSources
 *            &#x539F;&#x59CB;&#x6570;&#x636E;
 * @param keyApply
 *            Key&#x8F6C;&#x6362;&#x5668;
 * @param valueApply
 *            Value&#x8F6C;&#x6362;&#x5668;
 * @param <k>
 *            Key&#x6CDB;&#x578B;
 * @param <v>
 *            Value&#x6CDB;&#x578B;
 * @param <t>
 *            &#x539F;&#x59CB;&#x6570;&#x636E;&#x7C7B;&#x578B;
 * @return Map &#x62C6;&#x5206;&#x540E;&#x6570;&#x636E;
 */
public static <t, k, v> Map<k, v> dismantling(List<t> dataSources, Function<? super T, ? extends K> keyApply,
    Function<? super T, ? extends V> valueApply) {
    return StreamBinder.dismantling(newStream(dataSources), keyApply, valueApply);
}

public static <t> void removeIf(List<t> dataSources, Predicate<t> predicate) {
    if (Objects.nonNull(dataSources) && !dataSources.isEmpty()) {
        dataSources.removeIf(predicate);
    }
}

public static <t> void removeNotIf(List<t> dataSources, Predicate<t> predicate) {
    if (Objects.nonNull(dataSources) && !dataSources.isEmpty()) {
        dataSources.removeIf(t -> !predicate.test(t));
    }
}

/**
 * &#x5BF9;&#x6570;&#x636E;&#x6D41;&#x8FDB;&#x884C;&#x5206;&#x7EC4;
 *
 * @param dataSources
 *            &#x539F;&#x59CB;&#x6570;&#x636E;&#x6D41;
 * @param keyApply
 *            &#x5206;&#x7EC4;&#x9879;
 * @param <k>
 *            &#x5206;&#x7EC4;&#x9879;&#x6CDB;&#x578B;
 * @return Map &#x5206;&#x7EC4;&#x540E;&#x6570;&#x636E;
 */
public static <k, t> Map<k, list<t>> group(List<t> dataSources, Function<? super T, ? extends K> keyApply) {
    return StreamBinder.group(newStream(dataSources), keyApply);
}

/**
 * &#x5BF9;&#x6570;&#x636E;&#x6D41;&#x8FDB;&#x884C;&#x5206;&#x7EC4;,&#x5E76;&#x5BF9;&#x5206;&#x7EC4;&#x540E;&#x7684;&#x6570;&#x636E;&#x8FDB;&#x884C;&#x7C7B;&#x578B;&#x8F6C;&#x6362;
 *
 * @param dataSources
 *            &#x539F;&#x59CB;&#x6570;&#x636E;&#x6D41;
 * @param keyApply
 *            &#x5206;&#x7EC4;&#x9879;
 * @param valueApply
 *            &#x6570;&#x636E;&#x8F6C;&#x6362;&#x5668;
 * @param <k>
 *            &#x5206;&#x7EC4;&#x9879;&#x6CDB;&#x578B;
 * @param <v>
 *            &#x8F6C;&#x6362;&#x540E;&#x7684;&#x6570;&#x636E;&#x7C7B;&#x578B;
 * @return Map &#x5206;&#x7EC4;&#x540E;&#x6570;&#x636E;
 */
public static <k, t, v> Map<k, list<v>> group(List<t> dataSources, Function<? super T, ? extends K> keyApply,
    Function<? super T, ? extends V> valueApply) {
    return StreamBinder.group(newStream(dataSources), keyApply, valueApply);
}

/**
 * &#x5347;&#x5E8F;
 *
 * @param dataSources
 *            &#x6570;&#x636E;&#x96C6;&#x5408;
 * @param compareFunction
 *            &#x6392;&#x5E8F;&#x5B57;&#x6BB5;
 * @param <t>
 *            &#x96C6;&#x5408;&#x7C7B;&#x578B;&#x6CDB;&#x578B;&#x7C7B;
 * @return List<t>
 */
public static <t, u extends comparable<? super>> List<t> sortedAsc(List<t> dataSources,
    Function<t, u> compareFunction) {
    return sorted(newStream(dataSources), compareFunction, SortStrategy.UP, SortNullStrategy.NULL_IGNORE);
}

/**
 * &#x5347;&#x5E8F;
 *
 * @param dataStream
 *            &#x6570;&#x636E;&#x96C6;&#x5408;
 * @param compareFunction
 *            &#x6392;&#x5E8F;&#x5B57;&#x6BB5;
 * @param <t>
 *            &#x96C6;&#x5408;&#x7C7B;&#x578B;&#x6CDB;&#x578B;&#x7C7B;
 * @return List<t>
 */
public static <t, u extends comparable<? super>> List<t> sortedAsc(Stream<t> dataStream,
    Function<t, u> compareFunction) {
    return sorted(dataStream, compareFunction, SortStrategy.UP, SortNullStrategy.NULL_IGNORE);
}

/**
 * &#x5347;&#x5E8F;
 *
 * @param dataSources
 *            &#x6570;&#x636E;&#x96C6;&#x5408;
 * @param compareFunction
 *            &#x6392;&#x5E8F;&#x5B57;&#x6BB5;
 * @param sortNullStrategy
 *            &#x6392;&#x5E8F;&#x63A7;&#x5236;&#x7B56;&#x7565;
 * @param <t>
 *            &#x96C6;&#x5408;&#x7C7B;&#x578B;&#x6CDB;&#x578B;&#x7C7B;
 * @return List<t>
 */
public static <t, u extends comparable<? super>> List<t> sortedAsc(List<t> dataSources,
    Function<t, u> compareFunction, SortNullStrategy sortNullStrategy) {
    return sorted(newStream(dataSources), compareFunction, SortStrategy.UP, sortNullStrategy);
}

/**
 * &#x5347;&#x5E8F;
 *
 * @param dataStream
 *            &#x6570;&#x636E;&#x96C6;&#x5408;
 * @param compareFunction
 *            &#x6392;&#x5E8F;&#x5B57;&#x6BB5;
 * @param <t>
 *            &#x96C6;&#x5408;&#x7C7B;&#x578B;&#x6CDB;&#x578B;&#x7C7B;
 * @return List<t>
 */
public static <t, u extends comparable<? super>> List<t> sortedAsc(Stream<t> dataStream,
    Function<t, u> compareFunction, SortNullStrategy sortNullStrategy) {
    return sorted(dataStream, compareFunction, SortStrategy.UP, sortNullStrategy);
}

/**
 * &#x964D;&#x5E8F;
 *
 * @param dataSources
 *            &#x6570;&#x636E;&#x96C6;&#x5408;
 * @param compareFunction
 *            &#x6392;&#x5E8F;&#x5B57;&#x6BB5;
 * @param <t>
 *            &#x96C6;&#x5408;&#x7C7B;&#x578B;&#x6CDB;&#x578B;&#x7C7B;
 * @return List<t>
 */
public static <t, u extends comparable<? super>> List<t> sortedDesc(List<t> dataSources,
    Function<t, u> compareFunction) {
    return sorted(newStream(dataSources), compareFunction, SortStrategy.DOWN, SortNullStrategy.NULL_IGNORE);
}

/**
 * &#x964D;&#x5E8F;
 *
 * @param dataStream
 *            &#x6570;&#x636E;&#x96C6;&#x5408;
 * @param compareFunction
 *            &#x6392;&#x5E8F;&#x5B57;&#x6BB5;
 * @param <t>
 *            &#x96C6;&#x5408;&#x7C7B;&#x578B;&#x6CDB;&#x578B;&#x7C7B;
 * @return List<t>
 */
public static <t, u extends comparable<? super>> List<t> sortedDesc(Stream<t> dataStream,
    Function<t, u> compareFunction) {
    return sorted(dataStream, compareFunction, SortStrategy.DOWN, SortNullStrategy.NULL_IGNORE);
}

/**
 * &#x964D;&#x5E8F;
 *
 * @param dataSources
 *            &#x6570;&#x636E;&#x96C6;&#x5408;
 * @param compareFunction
 *            &#x6392;&#x5E8F;&#x5B57;&#x6BB5;
 * @param <t>
 *            &#x96C6;&#x5408;&#x7C7B;&#x578B;&#x6CDB;&#x578B;&#x7C7B;
 * @return List<t>
 */
public static <t, u extends comparable<? super>> List<t> sortedDesc(List<t> dataSources,
    Function<t, u> compareFunction, SortNullStrategy sortNullStrategy) {
    return sorted(newStream(dataSources), compareFunction, SortStrategy.DOWN, sortNullStrategy);
}

/**
 * &#x964D;&#x5E8F;
 *
 * @param dataStream
 *            &#x6570;&#x636E;&#x96C6;&#x5408;
 * @param compareFunction
 *            &#x6392;&#x5E8F;&#x5B57;&#x6BB5;
 * @param <t>
 *            &#x96C6;&#x5408;&#x7C7B;&#x578B;&#x6CDB;&#x578B;&#x7C7B;
 * @return List<t>
 */
public static <t, u extends comparable<? super>> List<t> sortedDesc(Stream<t> dataStream,
    Function<t, u> compareFunction, SortNullStrategy sortNullStrategy) {
    return sorted(dataStream, compareFunction, SortStrategy.DOWN, sortNullStrategy);
}

private enum SortStrategy {
    /**
     * &#x5347;&#x5E8F;
     */
    UP,
    /**
     * &#x964D;&#x5E8F;
     */
    DOWN;
}

public enum SortNullStrategy {

    /**
     * &#x5982;&#x679C;&#x503C;&#x4E3A;&#x7A7A;&#x5C31;&#x5FFD;&#x7565;
     */
    NULL_IGNORE,

    /**
     * &#x503C;&#x4E3A;&#x7A7A;&#x5C31;&#x653E;&#x6700;&#x540E;
     */
    NULL_LAST,

    /**
     * &#x503C;&#x4E3A;&#x7A7A;&#x5C31;&#x653E;&#x524D;&#x9762;
     */
    NULL_FIRST;
}

/**
 * @param dataStream
 *            &#x6570;&#x636E;&#x96C6;&#x5408;
 * @param compareFunction
 *            &#x6392;&#x5E8F;&#x5B57;&#x6BB5;
 * @param sortStrategy
 *            &#x6392;&#x5E8F;&#x7B56;&#x7565;
 * @param sortStrategy
 *            true&#x62A5;&#x5F02;&#x5E38;
 * @param <t>
 *            &#x96C6;&#x5408;&#x7C7B;&#x578B;&#x6CDB;&#x578B;&#x7C7B;
 * @return List<t>
 */
private static <t, u extends comparable<? super>> List<t> sorted(Stream<t> dataStream,
    Function<t, u> compareFunction, SortStrategy sortStrategy, SortNullStrategy sortNullStrategy) {
    Comparator<t> comparing;
    if (Objects.isNull(sortStrategy) || SortStrategy.UP == sortStrategy) {
        if (sortNullStrategy == SortNullStrategy.NULL_LAST) {
            comparing = Comparator.comparing(compareFunction, Comparator.nullsLast(U::compareTo));
        } else if (sortNullStrategy == SortNullStrategy.NULL_FIRST) {
            comparing = Comparator.comparing(compareFunction, Comparator.nullsFirst(U::compareTo));
        } else {
            comparing = Comparator.comparing(compareFunction);
        }
    } else {
        if (sortNullStrategy == SortNullStrategy.NULL_LAST) {
            comparing = Comparator.comparing(compareFunction, Comparator.nullsLast(U::compareTo).reversed());
        } else if (sortNullStrategy == SortNullStrategy.NULL_FIRST) {
            comparing = Comparator.comparing(compareFunction, Comparator.nullsFirst(U::compareTo).reversed());
        } else {
            comparing = Comparator.comparing(compareFunction, Comparator.reverseOrder());
        }
    }
    return dataStream.sorted(comparing).collect(Collectors.toList());
}

public static <t> boolean contains(T[] dataSources, T... elements) {
    return contains(Stream.of(dataSources), elements);
}

public static <t> boolean containsAny(T[] dataSources, T... elements) {
    return containsAny(Stream.of(dataSources), elements);
}

public static <t> boolean contains(List<t> dataSource, T... elements) {
    return contains(newStream(dataSource), elements);
}

public static <t> boolean containsAny(List<t> dataSource, T... elements) {
    return containsAny(newStream(dataSource), elements);
}

public static <t> boolean contains(Stream<t> dataStream, T... elements) {
    List<t> ts = mapToList(newStream(dataStream), Function.identity());
    if (Objects.isNull(elements)) {
        return false;
    }
    for (T element : elements) {
        if (!ts.contains(element)) {
            return false;
        }
    }
    return true;
}

public static <t> boolean containsAny(Stream<t> dataStream, T... elements) {
    List<t> ts = mapToList(dataStream, Function.identity());
    if (Objects.isNull(elements)) {
        return false;
    }
    for (T element : elements) {
        if (ts.contains(element)) {
            return true;
        }
    }
    return false;
}

@SafeVarargs
public static <t, r> List<r> merge(Function<t, r> mapper, List<t>... lists) {
    List<r> result = new ArrayList<>();
    for (R r : distinct(lists[0], mapper)) {
        boolean temp = true;
        for (int i = 1; i < lists.length; i++) {
            List<r> rs = EnhanceStream.distinct(lists[i], mapper);
            Map<r, r> reMapping = EnhanceStream.dismantling(rs, Function.identity());
            if (Objects.isNull(reMapping.get(r))) {
                temp = false;
            }
        }
        if (temp) {
            result.add(r);
        }
    }
    return EnhanceStream.distinct(result);
}

public static <t> T[] listToArr(List<t> dataList) {
    return (T[])dataList.toArray(new Object[0]);
}

public static <t> List<t> arrToList(T[] dataList) {
    return Stream.of(dataList).collect(Collectors.toList());
}
</t></t></t></t></r,></r></r></t></t,></r></t,></t></t></t></t></t></t></t></t></t></t></t></t></t></t,></t></t></t,></t></t></t,></t></t></t,></t></t></t,></t></t></t,></t></t></t,></t></t></t,></t></t></t,></t></t></t,></t></t></t,></t></t></t,></t></t></t,></t></t></t,></t></t></t,></t></t></t,></t></t></t,></t></t></t,></t></t></t></k,></k,></v></k></t></k,></k,></k></t></t></t></t></t></t></t></k,></t,></t></v></k></t></v></t,></t></v></t></t></t></t></t></t></t></k,></t,></x></v></k></t></t></k,></t,></v></k></t></t></k,></t,></k></t></t></k,></t,></k></t></t></k,></t,></k></t></t></k,></t,></k></t></t></k,></k,></k,></t></k></t></k,></k,></k,></t></k></t></k,></k,></k,></t></k></t></k,></t,></v></k></t></t></k,></t,></k></t></t></v></t,></v></t></t></t></t></t></t></t></t></t></t></t></t></t></t></t></t></t></t></t></t,></t></t></t></t></t></t></t></t></t></t,></t></t></t,></t></t,></t></t></t,></t></t></t,></x></t></t,></t></r></t,></r></t></t,></t></r></t,></r></t></t,></t></r></t,></r></t></t,></t></r></t,></r></t></r></r></list<r></t,></t></r></t,></r></t></t></t></t></t></t></r,></t,></t></v></t,></r></t></r1,></t,></t></r></t,></r></t></t,></t></r></t,></r></t></t,></t></r></t,></r></t></t,></t></r></t,></r></t></k></k,></k></k,></v></k></k,></v></k,></v></k,></v></k></v></k,></v></k,></v></k></v></k,></v></k,></v></k></t,></t></t></t></t,></t></t></t></t,></t></t></t></long></t,></t></t></t></integer></t,></t></t></t></integer></t,></t></t></t></r,></t,></t></t></t,></t></t></t1></t1,></t,></t></r></t,></t></t></r></t,></t></r></t,></t></t></t></t></t></t></t></t></t></t></k,></k,></t></t></t></p></t></t></t></k,></k,></k,></k,></v></k></t></t></t></t></t></t></t></t></t>

}

有兴趣可以一起交流工具类,请关注我得公众号

Lambda表达式工具类-日常搬砖

往事随风、无忧无恼

Original: https://www.cnblogs.com/qiuzhiqiang/p/16026527.html
Author: 邱志强
Title: Lambda表达式工具类-日常搬砖

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/570538/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球