Bootstrap

Stream流操作List集合一些常用方法封装

前言介绍(如果对你有帮助,请给我点点赞)

当我们在做Java项目时,经常需要对集合进行操作。而对于List集合来说,Stream流提供了一系列便捷的方法,可以帮助我们快速地完成集合的筛选、排序、聚合等操作。但是,由于Stream流的语法比较复杂,有时候会给我们带来一定的困扰。

为了解决这个问题,我在做项目的过程中,通过学习和总结,封装了一些常用的Stream流操作方法。这些方法可以让我们更加方便地对List集合进行处理,提高开发效率并减少出错的风险。

在下面的文档中,我将分享这些方法的实现思路和使用方法,希望能够对大家在日常开发中遇到的类似问题有所帮助

1、方法示例

批量修改集合对象的某个值

public static void main(String[] args) {
    //创建假数据, 对象属性为  id ,  name
    TUser u1 = new TUser("1","张三");
    TUser u2 = new TUser("2","李四");
    TUser u3 = new TUser("3","王五");
    TUser u4 = new TUser("4","赵六");
    List<TUser> userList = new ArrayList<>();
    //将对象添加到集合中
    userList.add(u1);userList.add(u2);userList.add(u3);userList.add(u4);
    //TODO 引用【批量修改集合对象的某个值】,实现将集合中所有对象的name修改为 坤哥
    //参数1:要处理的集合
    //参数2:要修改的属性
    //参数3:修改的值
    setListObjectByProperty(userList,TUser::setName,"坤哥");
    for (TUser tUser : userList) {
        System.out.println("修改后的对象:" + tUser);
    }
}

输出结果如下:

修改后的对象:TUser{id='1', name='坤哥'}
修改后的对象:TUser{id='2', name='坤哥'}
修改后的对象:TUser{id='3', name='坤哥'}
修改后的对象:TUser{id='4', name='坤哥'}

2、方法封装

import org.springframework.beans.BeanUtils;

import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.function.BiConsumer;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.stream.Collectors;

public class StreamUtils {


    /**
     * 批量修改集合对象的某个值
     * @param list: 待修改集合
     * @param consumer: 修改属性 泛型属性对象的set方法  Object::set方法
     * @param val: 新值
     * @param <T>: 目标对象泛型
     * @param <V>: 目标值泛型
     */
    public static <T,V> void setListObjectByProperty(List<T> list, BiConsumer<T,V> consumer, V val){
        list.forEach(bean -> consumer.accept(bean,val));
    }

    /**
     * 修改集合中满足条件的对象的指定属性的值
     * @param list: 目标集合
     * @param conditionProperty: 条件属性   Objecg::getFiled();
     * @param conditionValue: 条件值
     * @param consumer: 修改的属性 Objecg::setFiled();
     * @param newValue: 修改值
     * @param <T>: 目标对象泛型
     * @param <V>: 目标值泛型
     * @param <U>: 修改值泛型
     */
    public static <T, V, U> void updateListObjByField(
            List<T> list, Function<T, V> conditionProperty,
            V conditionValue, BiConsumer<T, U> consumer, U newValue) {
        list.stream()
                .filter(element -> conditionProperty.apply(element).equals(conditionValue))
                .forEach(element -> consumer.accept(element, newValue));
    }
    
    /**
     * 泛型对象的属性setter接口
     *
     * @param <T> 泛型类型
     */
    public interface PropertySetter<T> {
        void set(T target, Object value);
    }

    /**
     * List<SysUser> -> List<User>
     * 集合复制 【泛型可以不一样,但是泛型中的属性一样】
     * @param sourceList: 待赋值的集合
     * @param targetType: 泛型.class
     * @param <T>
     * @param <R>
     * @return
     */
    public static <T, R> List<R> copyList(List<T> sourceList, Class<R> targetType){
        return sourceList.stream()
                .map( bean -> {
                    try {
                        R target = targetType.getDeclaredConstructor().newInstance();
                        BeanUtils.copyProperties(bean,target);
                        return target;
                    } catch (Exception e) {
                        e.printStackTrace();
                        return null;
                    }
                }).collect(Collectors.toList());
    }

    /**
     * 根据指定条件过滤List集合中指定的元素信息
     * @param inputList: 源list集合
     * @param propertyExtractor: 指定对象过滤的属性  Object::getVal
     * @param values: 过滤属性条件集合值
     * @param <T>
     * @param <R>
     * @return
     */
    public static <T, R> List<T> filterListByPropertyRemove(List<T> inputList, Function<T, R> propertyExtractor, List<R> values) {
        Predicate<T> condition = item -> !values.contains(propertyExtractor.apply(item));
        return filterList(inputList, condition);
    }
    public static <T> List<T> filterList(List<T> inputList, Predicate<T> condition) {
        return inputList.stream()
                .filter(condition)
                .distinct()
                .collect(Collectors.toList());
    }

	/**
     *根据条件返回集合数据
     * @param inputList: 源list集合
     * @param propertyExtractor: 指定对象的属性  Object::getVal
     * @param values: 属性条件集合值
     * @param <T>
     * @param <R>
     * @return
     */
    public <T, R> List<T> filterListByPropertyReturn(List<T> inputList, Function<T, R> propertyExtractor, List<R> values) {
        return inputList.stream()
            .filter(item -> values.contains(propertyExtractor.apply(item)))
            .distinct()
            .collect(Collectors.toList());
    }

    /**
     * 【转Map】将集合中对象的属性作为key,val返回
     * @param inputList: 目标list
     * @param keyExtractor: key属性 Object:getObj
     * @param valueExtractor: val属性  Object:getObj
     * @param <T>
     * @param <K>
     * @param <V>
     * @return
     */
    public static <T, K, V> Map<K, V> extractPropertyToMap(List<T> inputList, Function<T, K> keyExtractor, Function<T, V> valueExtractor) {
        return inputList.stream()
                .collect(Collectors.toMap(keyExtractor, valueExtractor, (v1, v2) -> v2));
    }

	/**
     * 【转Map】指定集合中对象的属性为key,对象本身为val返回
     * @param inputList: 原集合
     * @param keyExtractor: 作为key的属性  Object:getObj
     * @param <T>
     * @param <K>
     * @return
     */
	public <T, K> Map<K, T> extractPropertyToMap(List<T> inputList, Function<T, K> keyExtractor) {
       return inputList.stream()
            .collect(Collectors.toMap(keyExtractor, Function.identity(), (v1, v2) -> v2));
    }

	/**
     * 将List<Object>集合按照某个属性进行分组
     * @param inputList: 原集合
     * @param keyExtractor: 分组的属性
     * @param <T>
     * @param <K>
     * @return
     */
    public static <T, K> Map<K, List<T>> groupByProperty(List<T> inputList, Function<T, K> keyExtractor) {
        return inputList.stream()
                .collect(Collectors.groupingBy(keyExtractor));
    }

    /**
     * 获取集合中指定元素重复的数据,并返回这个元素的值
     * @param list:源集合
     * @param propertyExtractor: 指定元素  Object::getVal
     * @param <T>
     * @param <R>
     * @return
     */
    public static <T, R> List<R> findDuplicates(List<T> list, Function<T, R> propertyExtractor) {
        Map<R, Long> propertyCountMap = list.stream()
                .collect(Collectors.groupingBy(propertyExtractor, Collectors.counting()));
        return propertyCountMap.entrySet().stream()
                .filter(entry -> entry.getValue() > 1)
                .map(Map.Entry::getKey)
                .collect(Collectors.toList());
    }

    /**
     * 提取List集合中对象的某个属性并返回集合
     * @param inputList: 目标集合
     * @param propertyExtractor: 泛型对象的属性  Object::getVal
     * @param <T>
     * @param <R>
     * @return
     */
    public static <T, R> List<R> extractPropertyToList(List<T> inputList, Function<T, R> propertyExtractor) {
        return inputList.stream()
                .map(propertyExtractor)
                .collect(Collectors.toList());
    }
    
    /**
     * 提取List集合中对象的某个属性
     * @param inputList: 目标集合
     * @param propertyExtractor: 泛型对象的属性  Object::getVal
     * @param returnType: 返回集合指定泛型  String.class
     * @param <T>
     * @param <R>
     * @return
     */
    public static <T, R> List<R> extractPropertyToListWithType(List<T> inputList, Function<T, R> propertyExtractor, Class<R> returnType) {
        return inputList.stream()
                .map(propertyExtractor)
                .collect(Collectors.toList());
    }

    /**
     * 提取List集合中指定条件的属性值
     * @param list:源集合
     * @param filter:指定条件属性  泛型属性对象的get()方法
     * @param mapper:返回属性     泛型属性对象的get()方法
     * @param cls:返回类型
     * @param value:条件值
     * @param <T>
     * @param <R>
     * @return
     */
    public static <T, R> List<R> extractPropertyToListWithTypeAndFilter(List<T> list, Function<T, String> filter, Function<T, R> mapper, Class<R> cls, String value) {
        return list.stream()
                .filter(obj -> filter.apply(obj).equals(value))
                .map(mapper)
                .collect(Collectors.toList());
    }

    /**
     * 校验集合中对象指定属性的值是否都满足传入条件值
     * @param collection: 源集合
     * @param propertyAccessor: 指定属性 get方法
     * @param expectedValue: 条件值
     * @param <T>
     * @param <E>
     * @return
     */
    public static <T, E> boolean validatePropertyAll(Collection<T> collection, Function<T, E> propertyAccessor, E expectedValue) {
        return collection.stream().allMatch(item -> expectedValue.equals(propertyAccessor.apply(item)));
    }
    /**
     * 校验集合中是否有一个对象的属性值满足传入条件值
     * @param collection: 源集合
     * @param propertyAccessor: 指定属性: 指定属性的 get方法
     * @param expectedValue: 条件值
     * @param <T>
     * @param <E>
     * @return
     */
    public static <T, E> boolean validatePropertyAny(Collection<T> collection, Function<T, E> propertyAccessor, E expectedValue) {
        return collection.stream().anyMatch(item -> expectedValue.equals(propertyAccessor.apply(item)));
    }

	/**
     * List<String>集合正序排序
     * @param list: 排序集合
     */
    public static void sortPositive(List<String> list) {
        Collections.sort(list);
    }

    /**
     * List<String>集合倒序排序
     * @param list: 排序集合
     */
    public static void sortReverse(List<String> list) {
        Collections.sort(list, Collections.reverseOrder());
    }

    /**
     * List<T>集合正序排序
     * @param list: 排序集合
     * @param keyExtractor: 对象属性
     * @param <T>
     */
    public static <T, R extends Comparable<? super R>> void sortPositiveByField(List<T> list, Function<? super T, ? extends R> keyExtractor) {
        Comparator<? super T> comparator = Comparator.comparing(keyExtractor);
        Collections.sort(list, comparator);
    }

    /**
     * List<T>集合倒序排序
     * @param list: 排序集合
     * @param keyExtractor: 对象属性
     * @param <T>
     * @param <R>
     */
    public static <T, R extends Comparable<? super R>> void sortReverseByField(List<T> list, Function<? super T, ? extends R> keyExtractor) {
        Comparator<? super T> comparator = Comparator.comparing(keyExtractor).reversed();
        Collections.sort(list, comparator);
    }




    
}








;