StreamUtils工具类

导包:

        <dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
            <version>20.0</version>
        </dependency>
        <dependency>
            <groupId>commons-collections</groupId>
            <artifactId>commons-collections</artifactId>
            <version>3.2.2</version>
        </dependency>

工具类:

import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.function.Function;
import java.util.stream.Collectors;
import java.util.stream.IntStream;

import org.apache.commons.collections.CollectionUtils;

import com.google.common.collect.Lists;
import com.google.common.collect.Sets;

/**
 * @author ycs
 */
public class StreamUtils {

    /**
     * 提取对象中的某一个属性
     * @param srcList 对象list
     * @param mapper 对象::get属性名
     * @param <T> 对象类型
     * @param <R> 属性类型
     * @return 属性list
     */
    public static <T, R> List<R> toList(List<T> srcList, Function<? super T, ? extends R> mapper) {
        if (CollectionUtils.isEmpty(srcList)) {
            return Lists.newArrayList();
        }
        return srcList.stream().map(mapper).collect(Collectors.toList());
    }

    /**
     * 提取对象中的某一个属性,去重
     * @param srcList 对象list
     * @param mapper 对象::get属性名
     * @param <T> 对象类型
     * @param <R> 属性类型
     * @return 属性set
     */
    public static <T, R> Set<R> toSet(List<T> srcList, Function<? super T, ? extends R> mapper) {
        if (CollectionUtils.isEmpty(srcList)) {
            return Sets.newHashSet();
        }
        return srcList.stream().map(mapper).collect(Collectors.toSet());
    }

    /**
     * 构建 属性:对象  map
     * @param srcList 对象list
     * @param mapper 对象::get属性名
     * @param <T> 对象类型
     * @param <K> 属性类型
     * @return 属性:对象 map
     */
    public static <T, K> Map<K, T> toMap(List<T> srcList, Function<? super T, ? extends K> mapper) {
        if (CollectionUtils.isEmpty(srcList)) {
            return new HashMap<>();
        }
        return srcList.stream().collect(Collectors.toMap(mapper, v -> v));
    }

    /**
     * 构建 属性:属性  map
     * @param srcList 对象list
     * @param mapper1 对象::get属性名
     * @param mapper2 对象::get属性名
     * @param <T> 对象类型
     * @param <K> 属性类型
     * @param <U> 属性类型
     * @return 属性:属性 map
     */
    public static <T, K, U> Map<K, U> toMap(List<T> srcList,
                                         Function<? super T, ? extends K> mapper1,
                                         Function<? super T, ? extends U> mapper2) {
        if (CollectionUtils.isEmpty(srcList)) {
            return new HashMap<>();
        }
        return srcList.stream().collect(Collectors.toMap(mapper1, mapper2));
    }

    /**
     * list分组
     * @param srcList 对象list
     * @param keyMapper 分组属性
     * @param <T>
     * @param <R>
     * @return
     */
    public static <T, R> Map<R, List<T>> groupBy(List<T> srcList, Function<? super T, ? extends R> keyMapper) {
        if (CollectionUtils.isEmpty(srcList)) {
            return new HashMap<>();
        }

        return srcList.stream().collect(Collectors.groupingBy(keyMapper));
    }

    /**
     * 切割 -> 操作 -> 归并
     * @param source
     * @param maxSize
     * @param mapper
     * @param <T>
     * @param <R>
     * @return
     */
    public static <T, R> List<T> splitListConvert(final Collection<R> source, final int maxSize,
                                           Function<List<R>, List<T>> mapper) {
        if (CollectionUtils.isEmpty(source)) {
            return new ArrayList<>(0);
        }
        if (maxSize <= 0) {
            throw new IllegalArgumentException("maxSize must be positive");
        }

        final int size = source.size();
        if (size <= maxSize) {
            if (source instanceof List) {
                return mapper.apply((List<R>) source);
            }
            return mapper.apply(new ArrayList<>(source));
        }

        final int step = (size + maxSize - 1) / maxSize;

        List<T> list = IntStream.range(0, step)
                .mapToObj(i -> source.stream().skip(i * maxSize).limit(maxSize).collect(Collectors.toList())).map(mapper)
                .filter(a -> a != null).flatMap(x -> x.stream()).collect(Collectors.toList());
        return list;
    }
}

演示demo:

public class Main {
    public static void main(String[] args) {
        Employee e1 = new Employee("张三", 23, 8000.0);
        Employee e2 = new Employee("李四", 24, 9000.0);
        Employee e3 = new Employee("王五", 25, 10000.0);
        Employee e4 = new Employee("赵六", 26, 11000.0);
        Employee e5 = new Employee("柠七", 18, 8000.0);
        List<Employee> es = Lists.newArrayList(e1, e2, e3, e4, e5);

        List<Double> afterTax = StreamUtils.toList(es, e -> e.getSalary() * 0.9);
        Set<Integer> ageSet = StreamUtils.toSet(es, Employee::getAge);
        Map<String, Employee> nameMap = StreamUtils.toMap(es, Employee::getName);
        Map<String, Integer> map = StreamUtils.toMap(es, Employee::getName, Employee::getAge);
        // indexName必须返回List<T>
        List<Employee> employees = StreamUtils.splitListConvert(es, 3, sub -> indexName(sub));
        Map<Double, List<Employee>> sameSalary = StreamUtils.groupBy(es, Employee::getSalary);
    }

    public static List<Employee> indexName(List<Employee> es) {
        for (int i = 0; i < es.size(); i++) {
            Employee employee = es.get(i);
            employee.setName(employee.getName() + i);
        }
        return es;
    }
}

@Data
@AllArgsConstructor
class Employee {
    private String name;

    private Integer age;

    private Double salary;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

夜长思

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

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

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

打赏作者

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

抵扣说明:

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

余额充值