Java lambda List,树数据处理工具类

前言

再日常的业务开发中,常少不了list for循环处理。 在查询mysql业务中,通常不会在for循环中去查询,而是一次去查询符合条件的数据,以避免频繁的释放和获取连接,然后转成map或者分组,在for 循环中通过注解去get处理。
在菜单和多级分类或者文件夹父子结构的数据中。又少不了一些过滤筛选。等等。所以封装出工具类。以便日常开发使用。

代码。

	import com.google.common.collect.Lists;
	import java.util.ArrayList;
	import java.util.Collection;
	import java.util.Comparator;
	import java.util.HashSet;
	import java.util.List;
	import java.util.Map;
	import java.util.Set;
	import java.util.TreeSet;
	import java.util.function.BiConsumer;
	import java.util.function.Consumer;
	import java.util.function.Function;
	import java.util.function.Predicate;
	import java.util.stream.Collectors;
	import lombok.extern.slf4j.Slf4j;
	
	/**
	* 数据处理工具类
	*
	* @author LiTing
	* @date 2021/2/26 11:05
	*/
	@Slf4j
	public class DataUtil {
	
	/**
	* list转树状
	*
	* @param list
	* @param getPidFunction 获取父id的方法
	* @param getIdFunction 获取id的方法
	* @param setSon 设置子集合的方法
	* @param heard 父节点id
	* @return java.util.ListVo<T> 返回最上级节点列表
	* @author : liting
	* @date : 2019/3/26 14:39
	*/
	public static <T, K> List<T> list2Tree(
		Collection<T> list,
		Function<T, K> getPidFunction,
		Function<T, K> getIdFunction,
		BiConsumer<T, List<T>> setSon,
		K heard) {
		List<T> ts = new ArrayList<>();
		for (T t : list) {
		boolean flag;
		K pid = getPidFunction.apply(t);
		if (heard == null) {
			flag = pid == null;
		} else {
			flag = pid != null && pid.equals(heard);
		}
		if (flag) {
			findSon(list, t, getIdFunction, getPidFunction, setSon);
			ts.add(t);
		}
		}
		return ts;
	}
	/**
	* list遍历
	*
	* @param ts 要遍历的集合
	* @param consumer 遍历时要执行的方法
	* @date 2021/6/18 13:29
	*/
	public static <T> void listForeach(List<T> ts, Consumer<T> consumer) {
		ts.forEach(consumer);
	}
	/**
	* 判断当前数以及其子节点 是否满足筛选条件
	*
	* @param t 树
	* @param predicate 筛选条件
	* @param getSon 获取子集合的方法
	* @param setSon 设置子集合的方法
	* @return boolean
	* @date 2021/6/18 13:36
	*/
	public static <T> boolean treeNodeFilter(
		T t, Predicate<T> predicate, Function<T, List<T>> getSon, BiConsumer<T, List<T>> setSon) {
		if (predicate.test(t)) {
		log.info("检测通过");
		return true;
		} else {
		List<T> sonTrees = getSon.apply(t);
		log.info("检测不通过 检测子节点");
		if (!isEmpty(sonTrees)) {
			List<T> tmpSonTree = new ArrayList<>();
			boolean flag = false;
			for (T son : sonTrees) {
			if (treeNodeFilter(son, predicate, getSon, setSon)) {
				flag = true;
				tmpSonTree.add(son);
			}
			}
			log.info("子节点检测结果:{}", flag);
			setSon.accept(t, tmpSonTree);
			return flag;
		} else {
			log.info("没有子节点");
			return false;
		}
		}
	}
	/**
	* 根据所有结果集list查找t的所有后代,并已树状返回t对象
	*
	* @param list 所有结果集
	* @param t 要查询的结果集
	* @param getIdFunction 获取id的方法
	* @param getParentFunction 获取父id的方法
	* @param setSon 设置子集合的方法
	* @date 2021/6/18 13:37
	*/
	public static <T, K> void findSon(
		Collection<T> list,
		T t,
		Function<T, K> getIdFunction,
		Function<T, K> getParentFunction,
		BiConsumer<T, List<T>> setSon) {
		K k = getIdFunction.apply(t);
		List<T> sonList =
			listTypeFilter(
				list, p -> getParentFunction.apply(p) != null && getParentFunction.apply(p).equals(k));
		sonList.forEach(p -> findSon(list, p, getIdFunction, getParentFunction, setSon));
		setSon.accept(t, sonList);
	}
	
	/**
	* 所有获取后代
	*
	* @author liting
	* @date 15:46 2021/1/9
	*/
	public static <T, K> List<T> getChildList(
		Collection<T> list, Function<T, K> getPidFunction, Function<T, K> getIdFunction, K id) {
		List<T> result = new ArrayList<>();
		for (T t : list) {
		if (getPidFunction.apply(t).equals(id)) {
			result.addAll(getChildList(list, getPidFunction, getIdFunction, getIdFunction.apply(t)));
			result.add(t);
		}
		}
		return result;
	}
	
	/**
	* 集合类型转换
	*
	* @param ts 要被转换的
	* @param function 转换方法
	* @return java.util.List<K>
	* @date 2021/6/18 13:48
	*/
	public static <T, K> List<K> listTypeChange(Collection<T> ts, Function<T, K> function) {
		if (ts != null && ts.size() > 0) {
		return ts.parallelStream().map(function).collect(Collectors.toList());
		} else {
		return new ArrayList<>();
		}
	}
	
	/**
	* 集合类型先过滤,再转换
	*
	* @param ts
	* @param biPredicate
	* @param function
	* @return java.util.List<K>
	* @date 2021/6/18 13:48
	*/
	public static <T, K> List<K> listTypeChange(
		Collection<T> ts, Predicate<T> biPredicate, Function<T, K> function) {
		if (ts != null && ts.size() > 0) {
		return ts.parallelStream().filter(biPredicate).map(function).collect(Collectors.toList());
		} else {
		return new ArrayList<>();
		}
	}
	/**
	* 判断集合是否为空
	*
	* @param list
	* @return java.lang.Boolean
	* @date 2021/6/18 13:49
	*/
	public static boolean isEmpty(Collection list) {
		return list == null || list.size() == 0;
	}
	/**
	* 集合类型转换并返回set
	*
	* @param ts
	* @param function
	* @return java.util.Set<K>
	* @date 2021/6/18 13:50
	*/
	public static <T, K> Set<K> listTypeChangeAnd2Set(Collection<T> ts, Function<T, K> function) {
		if (ts != null && ts.size() > 0) {
		return ts.parallelStream().map(function).collect(Collectors.toSet());
		} else {
		return new HashSet<>();
		}
	}
	/**
	* 集合过滤
	*
	* @param ts 集合
	* @param biPredicate 过滤方法
	* @return java.util.List<T>
	* @date 2021/6/18 13:51
	*/
	public static <T> List<T> listTypeFilter(Collection<T> ts, Predicate<T> biPredicate) {
		if (ts != null && ts.size() > 0) {
		return ts.parallelStream().filter(biPredicate).collect(Collectors.toList());
		} else {
		return new ArrayList<>();
		}
	}
	/**
	* 集合转map 前提是key 也就是function的返回值不能为空
	*
	* @param ts 集合
	* @param function 获取key的方法
	* @return java.util.Map<K,T>
	* @date 2021/6/18 13:52
	*/
	public static <T, K> Map<K, T> listToMap(Collection<T> ts, Function<T, K> function) {
		return ts.parallelStream().collect(Collectors.toMap(function, t -> t));
	}
	/**
	* 集合分组 前提是key 也就是function的返回值不能为空,不能重复
	*
	* @param ts 集合
	* @param function 获取key的方法
	* @return java.util.Map<K,T>
	* @date 2021/6/18 13:52
	*/
	public static <T, K> Map<K, List<T>> listGroup(Collection<T> ts, Function<T, K> function) {
		return ts.parallelStream().collect(Collectors.groupingBy(function));
	}
	/**
	* 集合分组并统计 前提是key 也就是function的返回值不能为空,不能重复
	*
	* @param ts
	* @param function
	* @return java.util.Map<K,java.lang.Long>
	* @date 2021/6/18 13:54
	*/
	public static <T, K> Map<K, Long> listGroupCount(List<T> ts, Function<T, K> function) {
		return ts.parallelStream().collect(Collectors.groupingBy(function, Collectors.counting()));
	}
	
	/**
	* list去重
	*
	* @param ts
	* @param keyExtractor
	* @return java.util.List<T>
	* @date 2021/6/18 13:58
	*/
	public static <T, U extends Comparable<? super U>> List<T> distinct(
		Collection<T> ts, Function<? super T, ? extends U> keyExtractor) {
		return ts.stream()
			.collect(
				Collectors.collectingAndThen(
					Collectors.toCollection(() -> new TreeSet<T>(Comparator.comparing(keyExtractor))),
					ArrayList::new));
	}
	
	public static boolean emptyCollection(Collection collection) {
		return collection == null || collection.size() == 0;
	}
	
	/**
	* 遍历一颗树的所有路径 如 A B C D E F 的路径集合为为 [[A,B],[A,C],[A,D,E],[A,D,F]]
	*
	* @param t 树
	* @param lists 路径集合
	* @param nodes 当前以及存在的路径
	* @param getSonFunc 获取子集合方法
	* @param setSon 设置子集合方法
	* @return java.util.List<java.util.List<T>>
	* @date 2021/6/18 13:59
	*/
	public static <T> List<List<T>> getAllPath(
		T t,
		List<List<T>> lists,
		List<T> nodes,
		Function<T, List<T>> getSonFunc,
		BiConsumer<T, List<T>> setSon) {
		List<T> childNodes = new ArrayList<>();
		if (getSonFunc.apply(t) != null) {
		childNodes = Lists.newCopyOnWriteArrayList(getSonFunc.apply(t));
		}
		setSon.accept(t, null);
		nodes.add(t);
		if (DataUtil.isEmpty(childNodes)) {
		lists.add(nodes);
		} else {
		for (T son : childNodes) {
			List<T> copyNodes = Lists.newCopyOnWriteArrayList(nodes);
			getAllPath(son, lists, copyNodes, getSonFunc, setSon);
		}
		}
		return lists;
	}
	
	/**
	* @param t 树
	* @param getSonFunc 获取子集合方法
	* @param setSon 设置子集合方法
	* @return java.util.List<T>
	* @date 2021/6/18 14:03
	*/
	public static <T> List<T> tree2List(
		T t, Function<T, List<T>> getSonFunc, BiConsumer<T, List<T>> setSon) {
		List<T> list = new ArrayList<>();
		List<T> sons = new ArrayList<>();
		if (getSonFunc.apply(t) != null) {
		sons = Lists.newCopyOnWriteArrayList(getSonFunc.apply(t));
		}
		setSon.accept(t, null);
		list.add(t);
		if (!isEmpty(sons)) {
		for (T son : sons) {
			list.addAll(tree2List(son, getSonFunc, setSon));
		}
		}
		return list;
	}
	/**
	* 树集合过滤
	*
	* @param trees 树集合
	* @param pi 过滤条件
	* @param getSonFunc 树对象获取子集合方法
	* @param setSon 设置子集合方法
	* @return java.util.List<T>
	* @date 2021/6/18 14:03
	*/
	public static <T> List<T> treeListFilter(
		List<T> trees,
		Predicate<T> pi,
		Function<T, List<T>> getSonFunc,
		BiConsumer<T, List<T>> setSon) {
		// 过滤
		trees =
			listTypeFilter(
				trees,
				ts ->
					treeNodeFilter(
						ts,
						// 过滤条件
						pi,
						getSonFunc,
						setSon));
		return trees;
	}
	}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Java高级工程师需要掌握以下技术栈: 1. 面向对象编程:Java是一门面向对象的编程语言,高级工程师需要深入理解面向对象的思想,掌握封装、继承、多态等概念,并能够熟练运用设计模式解决实际问题。 2. Java的超类:高级工程师需要了解Java的超类,如Object、Class、ClassLoader等,并能够熟练运用反射机制进行动态创建对象、调用方法等操作。 3. 异常处理:高级工程师需要掌握Java的异常处理机制,能够编写健壮的代码并处理各种异常情况。 4. 集合和泛型:高级工程师需要熟练掌握Java集合框架,包括List、Set、Map等常用集合类,并能够灵活运用泛型提高代码的可读性和安全性。 5. 基础IO操作:高级工程师需要掌握Java的IO操作,包括文件读写、网络IO等,并能够熟练运用NIO提高IO性能。 6. 多线程:高级工程师需要掌握Java的多线程编程,包括线程的创建、同步、通信等,并能够熟练运用线程池提高程序性能。 7. 网络编程:高级工程师需要掌握Java的网络编程,包括Socket编程、HTTP协议等,并能够熟练运用框架进行Web开发。 8. JDK新特性:高级工程师需要了解JDK的新特性,如Lambda表达式、Stream API等,并能够灵活运用提高代码的简洁性和可读性。 9. JVM深度剖析:高级工程师需要了解JVM的内部原理,包括运行时数据区、类加载机制、垃圾回收器等,并能够通过工具进行性能调优和问题排查。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

我的孤独与美酒

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

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

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

打赏作者

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

抵扣说明:

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

余额充值