lambda strem流表达式处理工具
一个通用的lambda stream流处理工具, 包含了工作中绝大部分场景常用的使用方式
import java.math.BigDecimal;
import java.util.*;
import java.util.function.BiFunction;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.stream.Collector;
import java.util.stream.Collectors;
import java.util.stream.Stream;import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.tuple.Pair;/*** lambda strem流表达式处理工具** @Date 2021/6/3 10:59 下午*/
public class LambdaUtils {/*** 默认分隔符*/public static final String DEFAULT_SPLIT_CHAR = ",";/*** 默认连接符*/public static final String DEFAULT_CONNECTOR_CHAR = "&&";/*** 查找list中的第一个** @param datas list数据* @param <T> list中的理性* @return 找到的第一个,可能为空*/public static <T> T findFirstOrNull(List<T> datas) {return findFirstOrDefault(datas, null);}public static <T> T findFirstOrDefault(List<T> datas, T t) {return Optional.ofNullable(datas).flatMap(e -> e.stream().findFirst()).orElse(t);}/*** 返回null或者默认值*/public static <T> T getOrDefault(T t, T def) {return Optional.ofNullable(t).orElse(def);}/*** 展平嵌套列表的工具方法,将嵌套list转换为单层list** @param listOfLists 嵌套的list* @param <T> list中的类型* @return 展平之后的list*/public static <T> List<T> flattenList(List<List<T>> listOfLists) {return listOfLists.stream().flatMap(List::stream).collect(Collectors.toList());}/*** 基于某个键值进行去重的工具方法, 使用map去重, 丢失了原来的顺序** @param list 参数list* @param keyExtractor 获取键值的函数* @param <T> list中数据的类型* @param <R> 去重字段的类型* @return 去重之后的list*/public static <T, R> List<T> distinctByKey(List<T> list, Function<? super T, R> keyExtractor) {if (CollectionUtils.isEmpty(list)) {return new ArrayList<>(0);}return new ArrayList<>(list.stream().collect(Collectors.toMap(keyExtractor, Function.identity(), (oo, no) -> oo)).values());}/*** 保持原有的顺序,去重*/public static <T, R> List<T> distinctByKeySort(List<T> list, Function<? super T, R> keyExtractor) {if (list == null) {return new ArrayList<>(0);}Set<R> seen = new LinkedHashSet<>(list.size());return list.stream().filter(element -> seen.add(keyExtractor.apply(element))).collect(Collectors.toList());}/*** 根据给定的判断将列表分区为两个子列表的工具方法, 满足判断条件的根据true获取结果, 不满足判断条件的根据false获取结果** @param list 需要被分区的list* @param predicate 分区的条件* @param <T> list中数据的类型* @return 分区后的map*/public static <T> Map<Boolean, List<T>> partitionBy(List<T> list, Predicate<T> predicate) {return Optional.ofNullable(list).map(items -> items.stream().collect(Collectors.partitioningBy(predicate))).orElse(new HashMap<>(0));}/*** 根据某个条件删除集合中的元素, 条件为true则删除** @param collection 集合对象* @param predicate 删除条件* @param <T> 集合中的数据类型*/public static <T> void removeIf(Collection<T> collection, Predicate<T> predicate) {if (collection != null) {collection.removeIf(predicate);}}public static <T> void dealAndConsumer(List<T> datas, Consumer<T> consumer) {Optional.ofNullable(datas).ifPresent(list -> list.forEach(consumer));}/*** 用func处理list中的每一条数据, 并收集到list中返回** @param datas list数据* @param func 处理每条数据的函数* @param <T> datas的数据类型* @param <R> func处理后的数据类型*/public static <T, R> List<R> dealAndtoList(List<T> datas, Function<T, R> func) {return Optional.ofNullable(datas).map(list -> list.stream().map(func).collect(Collectors.toList())).orElse(new ArrayList<>(0));}public static <T, R> List<R> dealAndtoFlattenList(List<T> datas, Function<T, List<R>> func) {return Optional.ofNullable(datas).map(list -> list.stream().map(func).flatMap(List::stream).collect(Collectors.toList())).orElse(new ArrayList<>(0));}/*** 处理嵌套list, func函数用来处理外部list获得嵌套的list, nestedFunc函数用来生成嵌套list的返回结果** @param datas 原始数据列表,可以是任何类型* @param func 函数,用于将列表中的每个元素转换为另一个列表* @param nestedFunc 嵌套函数,用于进一步处理转换后的列表中的每个元素* @return 处理后的列表,包含通过嵌套函数处理过的元素*/public static <OT, NT, NR> List<NR> dealAndNestedFlattenList(List<OT> datas, Function<OT, List<NT>> func, Function<NT, NR> nestedFunc) {// 使用Optional处理可能的null输入,确保在输入为null时返回空列表而不是抛出异常return Optional.ofNullable(datas)// 将列表中的每个元素使用提供的函数进行转换,然后通过flatMap进行扁平化处理.map(list -> list.stream().map(func).flatMap(List::stream)// 对扁平化后的每个元素应用嵌套函数,并收集到一个新的列表中.map(nestedFunc).collect(Collectors.toList()))// 如果输入为null,返回空列表.orElse(new ArrayList<>(0));}/*** 处理嵌套list, func函数用来处理外部list获得嵌套的list, outReturnFunc函数用来生成外部list返回的结果, nestedFunc函数用来生成嵌套list的返回结果* @param datas 数据源* @param func 获得嵌套list的函数* @param outReturnFunc 获得外部list结果的函数* @param nestedFunc 获得内部list结果的函数* @return 一个pair对象, 第一个元素是外部list的结果, 第二个元素是内部list的结果* @param <OT> 外层list的元素类型* @param <NT> 内部list的元素类型* @param <OR> 外部list的返回结果* @param <NR> 内部list的返回结果*/public static <OT, NT, OR, NR> Pair<List<OR>, List<NR>> dealAndNestedFlattenList(List<OT> datas, Function<OT, List<NT>> func, Function<OT, OR> outReturnFunc, Function<NT, NR> nestedFunc) {if (CollectionUtils.isEmpty(datas)) {return Pair.of(new ArrayList<>(0), new ArrayList<>(0));}List<OR> outResult = new ArrayList<>(datas.size());List<NR> innserResult = new ArrayList<>();for (OT data : datas) {// 外部list返回的结果OR outRt = outReturnFunc.apply(data);outResult.add(outRt);// 内部listList<NT> innerList = func.apply(data);if (CollectionUtils.isEmpty(innerList)) {continue;}for (NT r : innerList) {// 内部list返回的结果NR innerRt = nestedFunc.apply(r);innserResult.add(innerRt);}}return Pair.of(outResult, innserResult);}/*** 将datas中的数据按照func处理,返回处理后的数据集合,然后将该集合给consumer消费** @param datas list数据* @param func 处理每条数据的函数* @param consumer 消费func处理后的数据集* @param <T> datas的数据类型* @param <R> func处理后的数据类型*/public static <T, R> void dealAndConsumer(List<T> datas, Function<T, R> func, Consumer<List<R>> consumer) {Optional.ofNullable(datas).map(list -> list.stream().map(func).collect(Collectors.toList())).ifPresent(consumer);}/*** 用func处理list中的每条数据,然后给consumer消费;如果func处理的某条数据为空,那么该条数据不会被consumer消费*/public static <T, R> void dealAndConsumerWithoutNull(List<T> datas, Function<T, R> func,Consumer<List<R>> consumer) {Optional.ofNullable(datas).map(list -> list.stream().map(func).filter(Objects::nonNull).collect(Collectors.toList())).ifPresent(consumer);}/*** 用func处理set中的每条数据,然后给consumer消费;如果处理的为空,那么不会被consumer消费*/public static <T, R> void dealAndConsumerWithoutNull(Set<T> datas, Function<T, R> func, Consumer<Set<R>> consumer) {Optional.ofNullable(datas).map(set -> set.stream().map(func).filter(Objects::nonNull).collect(Collectors.toSet())).ifPresent(consumer);}/*** list转map,转换后的key不会重复(如果有key冲突, 前者覆盖后者)** @param datas 待转换的list* @param keyFunc 生成key的函数,例如 Class::getName* @param <T> list集合中的元素类型* @param <R> 生成的map的key的类型* @return 返回生成的map对象*/public static <T, R> Map<R, T> list2Map(List<T> datas, Function<T, R> keyFunc) {return Optional.ofNullable(datas).map(as -> as.stream().collect(Collectors.toMap(keyFunc, Function.identity(), (eo, no) -> eo))).orElse(new HashMap<>(0));}/*** list转map,转换后的key不会重复(如果有key冲突, 前者覆盖后者); 注意: 如果valFunc得到的结果是null,将会NPE异常** @param datas 待转换的list* @param keyFunc 生成key的函数,例如 Class::getName* @param valFunc 生成value的函数,例如 Class::getName* @param <T> list集合中的元素类型* @param <R> 生成的map的key的类型* @param <V> 生成的map的value的类型* @return 返回生成的map对象*/public static <T, R, V> Map<R, V> list2Map(List<T> datas, Function<T, R> keyFunc, Function<T, V> valFunc) {return Optional.ofNullable(datas).map(as -> as.stream().collect(Collectors.toMap(keyFunc, valFunc, (eo, no) -> no))).orElse(new HashMap<>(0));}/*** 根据两个个key值生成map*/public static <T> Map<String, T> list2MapMultiKey(List<T> datas, Function<T, Object> keyFunc, Function<T, Object> keyFunc2) {return Optional.ofNullable(datas).map(as -> as.stream().collect(Collectors.toMap(e -> keyFunc.apply(e) + DEFAULT_CONNECTOR_CHAR + keyFunc2.apply(e), Function.identity(), (eo, no) -> no))).orElse(new HashMap<>(0));}/*** 过滤掉list中的null元素** @param datas 待过滤的list* @param <T> list中的元素类型* @return 去掉null元素的之后的list结合*/public static <T> List<T> filterNull(List<T> datas) {return Optional.ofNullable(datas).map(list -> list.stream().filter(Objects::nonNull).collect(Collectors.toList())).orElse(new ArrayList<>(0));}/*** 过滤list中的元素** @param datas 待过滤的list* @param predicate 过滤条件* @param <T> list中的元素类型* @return 过滤后的list*/public static <T> List<T> filter(List<T> datas, Predicate<T> predicate) {return Optional.ofNullable(datas).map(list -> list.stream().filter(predicate).collect(Collectors.toList())).orElse(new ArrayList<>(0));}public static <T> boolean anyMatch(List<T> datas, Predicate<T> predicate) {return Optional.ofNullable(datas).map(list -> list.stream().anyMatch(predicate)).orElse(false);}public static <T> boolean allMatch(List<T> datas, Predicate<T> predicate) {return Optional.ofNullable(datas).map(list -> list.stream().allMatch(predicate)).orElse(false);}public static <T> boolean noneMatch(List<T> datas, Predicate<T> predicate) {return Optional.ofNullable(datas).map(list -> list.stream().noneMatch(predicate)).orElse(false);}/*** list转string,以,分割** @param datas list数据* @param func 处理list中每个元素的函数* @param <T> list中的数据类型* @return 处理后的string, 如果datas为空,默认返回null*/public static <T> String list2Str(List<T> datas, Function<T, String> func) {return list2StrWithSeparator(datas, func, DEFAULT_SPLIT_CHAR);}/*** list转string,自定义分隔符** @param datas list数据* @param func 处理list中每个元素的函数* @param separator 分隔符* @param <T> list中的数据类型* @return 处理后的string, 如果datas为空,默认返回null*/public static <T> String list2StrWithSeparator(List<T> datas, Function<T, String> func, String separator) {return Optional.ofNullable(datas).map(list -> list.stream().map(func).collect(Collectors.joining(separator))).orElse(null);}/*** map转list** @param datas map对象* @param func 处理map中每一对元素的函数* @param <K> key的类型* @param <V> value的类型* @param <R> 返回的list中元素类型* @return 转换后的list对象*/public static <K, V, R> List<R> map2List(Map<K, V> datas, BiFunction<K, V, R> func) {return Optional.ofNullable(datas).map(m -> m.entrySet().stream().map(me -> func.apply(me.getKey(), me.getValue())).collect(Collectors.toList())).orElse(null);}/*** 分组, 根据指定的key, 返回同一组实体对象** @param list 集合数据* @param keyFunc 获取key的方法* @param <K> key的类型* @param <T> 集合中的数据类型* @return 转换后的map或者不可变map*/public static <K, T> Map<K, List<T>> groupBy(List<T> list, Function<T, K> keyFunc) {return Optional.ofNullable(list).map(tl -> tl.stream().collect(Collectors.groupingBy(keyFunc))).orElse(new HashMap<>(0));}/*** 根据某个 key 进行分组,并将两个不同类型的值分别放入两个 List 中,返回 Map<K, Pair<List<V1>, List<V2>>>** @param items 输入的列表* @param keyMapper 用于获取 key 的方法* @param value1Mapper 用于获取第一个 List 值的映射方法* @param value2Mapper 用于获取第二个 List 值的映射方法* @param <K> 分组的 key 类型* @param <V> 输入的列表项类型* @param <V1> 第一个 List 的值类型* @param <V2> 第二个 List 的值类型* @return Map<K, Pair < List < V1>, List<V2>>> 格式的数据*/public static <K, V, V1, V2> Map<K, Pair<List<V1>, List<V2>>> groupBy(List<V> items, Function<V, K> keyMapper,Function<V, V1> value1Mapper, Function<V, V2> value2Mapper) {// 创建一个 Map,用于存储结果Map<K, Pair<List<V1>, List<V2>>> resultMap = new HashMap<>();// 遍历输入的 items 列表for (V item : items) {// 通过 keyMapper 获取分组 keyK key = keyMapper.apply(item);// 使用 computeIfAbsent 确保每个 key 对应一个 Pair<List<V1>, List<V2>>Pair<List<V1>, List<V2>> pair =resultMap.computeIfAbsent(key, k -> Pair.of(new ArrayList<>(), new ArrayList<>()));// 将第一个值加入 Pair 的第一个 List 中pair.getKey().add(value1Mapper.apply(item));// 将第二个值加入 Pair 的第二个 List 中pair.getValue().add(value2Mapper.apply(item));}// 返回结果 Mapreturn resultMap;}/*** 两层次分组的通用方法,生成 Map<K1, Map<K2, V2>> 格式的结果 根据 keyMapper1 和 keyMapper2 分别对列表中的元素进行分组,并将元素映射到 valueMapper 中,最后使用* resultCollector 收集结果** @param items 输入的列表* @param keyMapper1 第一层分组的 key 提取器* @param keyMapper2 第二层分组的 key 提取器* @param valueMapper 用于将列表项映射成最终的值* @param <V> 输入的列表项类型* @param <K1> 第一层分组的 key 类型* @param <K2> 第二层分组的 key 类型* @param <V2> 第二次分组的值类型* @param <V3> 最终映射的值类型* @return Map<K1, Map < K2, V2>> 分组后的结果*/public static <V, K1, K2, V2, V3> Map<K1, Map<K2, V3>> multiLevelGroupBy(List<V> items, Function<V, K1> keyMapper1,Function<V, K2> keyMapper2, Function<V, V2> valueMapper, Collector<V2, ?, V3> resultCollector) {if (items == null) {return new HashMap<>(0);}return items.stream().collect(Collectors.groupingBy(keyMapper1,Collectors.groupingBy(keyMapper2, Collectors.mapping(valueMapper, resultCollector))));}/*** 多个key组成对象的map; 例如 {k1&&k2, [v1,v2]},{k1&&k3, [v1,v2]}*/public static <T, K> Map<String, List<T>> groupByMultiKey(List<T> list, Function<T, K>... keyFuncs) {if (list == null) {return new HashMap<>(0);}if (keyFuncs == null || keyFuncs.length == 0) {return new HashMap<>(0);}return list.stream().collect(Collectors.groupingBy(e -> Stream.of(keyFuncs).map(keyFunc -> keyFunc.apply(e) + "").collect(Collectors.joining(DEFAULT_CONNECTOR_CHAR))));}/*** 先对每一条元素执行consumer操作 然后根据指定的key分组** @param list 待处理的list* @param consumer 执行的consumer* @param keyFunc 获取key的方法* @param <K> key的类型* @param <T> 集合中的数据类型* @return 转换后的map或者不可变map*/public static <K, T> Map<K, List<T>> consumerAndGroupBy(List<T> list, Consumer<T> consumer,Function<T, K> keyFunc) {return Optional.ofNullable(list).map(tl -> tl.stream().collect(Collectors.groupingBy(keyFunc, Collectors.mapping(item -> {consumer.accept(item); // 执行副作用操作return item;}, Collectors.toList())))).orElse(new HashMap<>(0));}/*** 分组求和** @param list 待处理的list* @param keyFunc 获取key的方法* @param sumFieldKey 需要求和的字段* @param <K> 分组字段的类型* @param <T> 数据类型* @return 分组求和的结果*/public static <K, T> Map<K, BigDecimal> groupAndSum(List<T> list, Function<T, K> keyFunc, Function<T, BigDecimal> sumFieldKey) {if (CollectionUtils.isEmpty(list)) {return new HashMap<>(0);}return list.stream().collect(Collectors.groupingBy(keyFunc,Collectors.reducing(BigDecimal.ZERO, sumFieldKey, BigDecimal::add)));}/*** 分组, 根据指定的key, 返回同一组value** @param list 集合数据* @param keyFunc 获取key的方法* @param valFunc 获取value的方法* @param <K> key的类型* @param <T> 集合中的数据类型* @param <V> value的类型* @return*/public static <K, T, V> Map<K, List<V>> groupBy(List<T> list, Function<T, K> keyFunc, Function<T, V> valFunc) {return Optional.ofNullable(list).map(tl -> tl.stream().collect(Collectors.groupingBy(keyFunc, Collectors.mapping(valFunc, Collectors.toList())))).orElse(new HashMap<>(0));}/*** 嵌套分组, 将list集合中的数据按照某个键值进行分组,再按照另一个键值进行分组,返回嵌套的map对象, 类似与group by k1,k2** @param list 需要分组的集合* @param keyExtractor1 分组键值1* @param keyExtractor2 分组键值2* @param <T> 集合中元素类型* @param <K1> 第一层分组的键值类型* @param <K2> 第二层分组的键值类型* @return*/public static <T, K1, K2> Map<K1, Map<K2, List<T>>> nestedGroupBy(List<T> list, Function<T, K1> keyExtractor1,Function<T, K2> keyExtractor2) {return Optional.ofNullable(list).map(tl -> tl.stream().collect(Collectors.groupingBy(keyExtractor1, Collectors.groupingBy(keyExtractor2)))).orElse(new HashMap<>(0));}/*** 嵌套分组, 将list集合中的数据按照某个键值进行分组,再按照另一个键值进行分组,再按照另一个键值进行分组,返回嵌套的map对象, 类似与group by k1,k2,k3** @param list 需要分组的集合* @param classifier1 第一层分组的键值类型* @param classifier2 第二层分组的键值类型* @param classifier3 第三层分组的键值类型*/public static <T, K1, K2, K3> Map<K1, Map<K2, Map<K3, List<T>>>> nestedGroupingBy(List<T> list,Function<T, K1> classifier1, Function<T, K2> classifier2, Function<T, K3> classifier3) {return Optional.ofNullable(list).map(tl -> tl.stream().collect(Collectors.groupingBy(classifier1, Collectors.groupingBy(classifier2, Collectors.groupingBy(classifier3))))).orElse(new HashMap<>(0));}/*** bigDecimal求和, 过滤掉了空值*/public static BigDecimal sumBigDecimal(List<BigDecimal> numbers) {return Optional.ofNullable(numbers).map(list -> list.stream().filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add)).orElse(BigDecimal.ZERO);}/*** 根据key分组求和*/public static <T> BigDecimal sumBigDecimalByKey(List<T> list, Function<T, BigDecimal> keyExtractor) {return Optional.ofNullable(list).map(tl -> tl.stream().map(keyExtractor).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add)).orElse(BigDecimal.ZERO);}/*** 按照对象的某个属性进行升序排序** @param list 待排序的对象列表* @param keyExtractor 提取排序键的函数* @param <T> 对象类型* @param <U> 排序键类型*/public static <T, U extends Comparable<? super U>> void sortBy(List<T> list, Function<T, U> keyExtractor) {Optional.ofNullable(list).ifPresent(tl -> tl.sort(Comparator.comparing(keyExtractor)));}/*** 按照对象的某个属性进行降序排序** @param list 待排序的对象列表* @param keyExtractor 提取排序键的函数* @param <T> 对象类型* @param <U> 排序键类型*/public static <T, U extends Comparable<? super U>> void sortByDesc(List<T> list, Function<T, U> keyExtractor) {Optional.ofNullable(list).ifPresent(tl -> tl.sort(Comparator.comparing(keyExtractor).reversed()));}/*** 多属性排序:支持多条件的排序,按照第一个属性排序,然后是第二个属性,以此类推** @param list 待排序的对象列表* @param keyExtractors 排序键提取函数列表* @param <T> 对象类型*/@SafeVarargs@SuppressWarnings("unchecked")public static <T> void sortByMulti(List<T> list, Function<T, ? extends Comparable<?>>... keyExtractors) {if (list == null || keyExtractors.length == 0) {return;}Comparator<T> comparator = null;for (Function<T, ? extends Comparable<?>> keyExtractor : keyExtractors) {if (comparator == null) {comparator = Comparator.comparing((Function<T, Comparable<Object>>) keyExtractor);} else {comparator = comparator.thenComparing((Function<T, Comparable<Object>>) keyExtractor);}}list.sort(comparator);}/*** 多属性降序排序:支持多条件的降序排序,按照第一个属性降序排序,然后是第二个属性,以此类推** @param list 待排序的对象列表* @param keyExtractors 排序键提取函数列表* @param <T> 对象类型*/@SafeVarargs@SuppressWarnings("unchecked")public static <T> void sortByMultiDesc(List<T> list, Function<T, ? extends Comparable<?>>... keyExtractors) {if (list == null || keyExtractors.length == 0) {return;}Comparator<T> comparator = null;for (Function<T, ? extends Comparable<?>> keyExtractor : keyExtractors) {if (comparator == null) {comparator =Comparator.comparing((Function<T, Comparable<Object>>) keyExtractor, Comparator.reverseOrder());} else {comparator =comparator.thenComparing((Function<T, Comparable<Object>>) keyExtractor, Comparator.reverseOrder());}}list.sort(comparator);}/*** 多属性排序:支持多条件的排序, 可以指定某个条件升序还是降序, 按照第一个属性排序,然后是第二个属性,以此类推*/public static <T> void sortByRules(List<T> list,Pair<Function<T, ? extends Comparable<?>>, Boolean>... keyExtractors) {if (list == null || keyExtractors.length == 0) {return;}Comparator<T> comparator = null;for (Pair<Function<T, ? extends Comparable<?>>, Boolean> pair : keyExtractors) {if (comparator == null) {comparator =Comparator.comparing((Function<T, Comparable<Object>>) pair.getLeft(), getSortRule(pair.getRight()));} else {comparator = comparator.thenComparing((Function<T, Comparable<Object>>) pair.getLeft(),getSortRule(pair.getRight()));}}list.sort(comparator);}private static <T extends Comparable<? super T>> Comparator<T> getSortRule(boolean asc) {if (asc) {return Comparator.naturalOrder();} else {return Comparator.reverseOrder();}}
}
相关文章:
lambda strem流表达式处理工具
一个通用的lambda stream流处理工具, 包含了工作中绝大部分场景常用的使用方式 import java.math.BigDecimal; import java.util.*; import java.util.function.BiFunction; import java.util.function.Consumer; import java.util.function.Function; import java.util.funct…...
Android 编译和使用libheif
项目中需要使用libheif,libde265,libyuv。一下是相应的cmakelist.txt。这里直接使用了静态库。 里面涉及到c包的链接,需要stdc。 ${PROJECT_SOURCE_DIR}/../jniLibs/${ANDROID_ABI}/liblibde265.a这个路径由于操作过程中copy出现问题,多了一层路径&…...
新一代零样本无训练目标检测
🏡作者主页:点击! 🤖编程探索专栏:点击! ⏰️创作时间:2024年12月2日21点02分 神秘男子影, 秘而不宣藏。 泣意深不见, 男子自持重, 子夜独自沉。 论文链接 点击开启你的论文编程之旅h…...
神经网络入门实战:(九)分类问题 → 神经网络模型搭建模版和训练四步曲
(一) 神经网络模型搭建官方文档 每一层基本都有权重和偏置,可以仔细看官方文档。 pytorch 官网的库:torch.nn — PyTorch 2.5 documentation Containers库:用来搭建神经网络框架(包含所有的神经网络的框架);…...
写NFC微信小程序跳转Uri标签
本示例使用的发卡器:https://item.taobao.com/item.htm?spma21dvs.23580594.0.0.52de2c1b8bEEGz&ftt&id615391857885 Dim dispstr As String Dim status As Byte Dim status1 As Byte Dim afi As Byte Dim myctrlword As Byte Dim mypiccserial(0 To 7) …...
Gradle vs. Maven: 到底哪个更适合java 项目?
ApiHug ApiHug - API Design & Develop New Paradigm.ApiHug - API Design & Develop New Paradigm.https://apihug.com/ 首先 ApiHug 整个工具链是基于 gradle 构建,包括项目模版, 插件; 说到 Java 项目管理,有两个巨头脱颖而出&a…...
【赛博保安】安全日记之常用术语(一)
"企业的信息安全治理水平,直接取决于安全团队人员的技术专业度,而非运营经验值。所谓的技术,并非指渗透和挖洞的能力,而是指软件开发、IT 架构、网络拓扑相关的知识和经验。 站在乙方的角度来看,技术薄弱的安全人…...
设计模式 更新ing
设计模式 1、六大原则1.1 单一设计原则 SRP1.2 开闭原则1.3 里氏替换原则1.4 迪米特法则1.5 接口隔离原则1.6 依赖倒置原则 2、工厂模式 1、六大原则 1.1 单一设计原则 SRP 一个类应该只有一个变化的原因 比如一个视频软件,区分不同的用户级别 包括访客࿰…...
008静态路由-特定主机路由
按照如上配置,用192.168.0.1 电脑ping 192.168.1.1 发现能够ping通 用192.168.0.1 电脑ping 192.168.2.1 发现不能ping通 这是因为192.168.0.1 和 192.168.1.1 使用的是同一个路由器R1。 192.168.0.1 和 192.168.2.1 通信需要先经过R1,再经过R2 …...
MySQL 慢查询日志记录 SQL优化 性能优化 日志查询 Explain
介绍 慢查询日志记录了所有执行时间超过指定参数(long_query_time,单位:秒,默认10秒)的所有SQL语句的日志。MySQL的慢查询日志默认没有开启,需要在MySQL的配置文件(/etc/my.cnf)中配置针对这些慢查询的SQL语句进行优化。 #开启慢查询开关 s…...
VINS_MONO视觉导航算法【三】ROS基础知识介绍
文章目录 其他文章说明ROSlaunch文件基本概念定义用途 文件结构根标签常用标签\<node>\<param>\<rosparam>\<remap>\<include>\<arg>\<group> 示例基本示例嵌套示例 使用方法启动 *.launch 文件传递参数 总结 ROS topicTopic 的基本…...
Python 3 教程第13篇(集合)
Python3 集合 集合(set)是一个无序的不重复元素序列。 集合中的元素不会重复,并且可以进行交集、并集、差集等常见的集合操作。 可以使用大括号 { } 创建集合,元素之间用逗号 , 分隔, 或者也可以使用 set() 函数创建集…...
cesium 3dtile ClippingPlanes 多边形挖洞ClippingPlaneCollection
原理就是3dtiles里面的属性clippingPlanes 采用ClippingPlaneCollection,构成多边形来挖洞。 其次就是xyz法向量挖洞 clippingPlanes: new this.ffCesium.Cesium.ClippingPlaneCollection({unionClippingRegions: true, // true 表示多个切割面能合并为一个有效的…...
开发者如何使用GCC提升开发效率GUI操作
看此篇前请先阅读https://blog.csdn.net/qq_20330595/article/details/144139026?spm1001.2014.3001.5502 先上效果图 找到对应的环境版本 配置环境 目录结构 CtrlShiftP c_cpp_properties.json {"configurations": [{"name": "Win32","i…...
什么是隐式类型转换?
隐式类型转换(Implicit Type Conversion)是指编译器在没有明确要求的情况下,自动地将一种类型的值转换为另一种类型。C 语言支持隐式类型转换,这通常发生在表达式运算或函数调用中,以确保操作数或参数的类型兼容性。 隐…...
爬虫专栏第三篇:Python 实战:运用 requests 突破京东商品评论获取难题(含 cookie 处理与编码设置技巧
简介:本文以京东商品评论为例,详细介绍了使用requests库获取网页数据的过程,包括从打开商品评价页面、抓包分析找到评论接口,到处理cookie参数、解决cookie字符串解析问题,以及设置正确的编码以成功获取评论数据&#…...
HCIE:详解OSPF,从基础到高级特性再到深入研究
目录 前言 一、OSPF协议基本原理 简介 基本原理 OSPF路由器类型 OSPF网络类型 OSPF报文类型和封装 OSPF邻居的建立的维护 DR和BDR的选举 伪节点 LSDB的更新 OSPF的配置 二、OSPF的高级特性 虚连接(Virtual-Link) OSPF的LSA和路由选择 OSPF…...
第六十六条:谨慎使用本地方法
其实在java中有很多都是采用C或C语言实现的比如native这种的本地方法,感兴趣的可以找源代码看看。 Java Native Interface (JNI) 允许Java应用程序可以调用本地方法(native method),所谓本地方法是指使用本地程序设计语言…...
neo4j如何存储关于liquidity structure的层次和关联结构
在 Neo4j 中存储关于流动性结构(liquidity structure)的层次和关联结构非常适合,因为 Neo4j 是一个基于图的数据库,能够自然地建模和存储复杂的关系和层次结构。下面是如何在 Neo4j 中设计和实现这样的数据模型的详细步骤和示例。…...
45 基于单片机的信号选择与温度变化
目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 基于51单片机,采用DS18B20检测温度,通过三种LED灯代表不同状态。 采用DAC0832显示信号脉冲,通过8位数码管显示温度。 信号脉冲可以根据两个按键分别调整为正弦…...
2、Three.js初步认识场景Scene、相机Camera、渲染器Renderer三要素
三要素之间关系: 有了虚拟场景Scene,相机录像Camera,在相机小屏幕上看到的Renderer Scene当前空间 Mesh人在场景 Camera相机录像 Renderer显示器上 首先先描述下Scene: 这个场景为三要素之一,一切需要展示的东西都需…...
Java基础面试题06:hashCode()和equals()方法的重要性体现在什么地方?
前言 Java中的hashCode()和equals()方法看似是干同一件事,但它们的使用场景和作用却大有不同。为了让程序更高效、更准确地运行,我们需要对这两者有深入的了解,并掌握它们的重写规则。 hashCode()和equals()的基础知识 什么是hashCode&…...
Matlab Simulink HDL Coder开发流程(一)— 创建HDL兼容的Simulink模型
创建HDL兼容的Simulink模型 一、使用Balnk DUT模板二、从HDL Coder库中选择模块三、为DUT开发算法/功能四、为设计创建Testbench五、仿真验证设计功能六、Simulink模型生成HDL代码 这个例子说明了如何创建一个用于生成HDL代码的Simulink模型。要创建兼容HDL代码生成的MATLAB算法…...
C#基础之方法
文章目录 1 方法1.1 定义方法1.2 参数传递1.2.1 按值传递参数1.2.2 按引用传递参数1.2.3 按输出传递参数1.2.4 可变参数 params1.2.5 具名参数1.2.6 可选参数 1.3 匿名方法1.3.1 Lambda 表达式1.3.1.1 定义1.3.1.2 常用类型1.3.1.3 Lambda 表达式与 LINQ1.3.1.4 Lambda 表达式的…...
Pytest框架学习19--参数化2
1、数据源是yaml 安装yaml,使用safe_load方法读取文件,解析出数据 pip install PyYAML # test_data.yaml test_case_1:a: 2b: 3expected_result: 5test_case_2:a: -1b: 10expected_result: 9test_case_3:a: 0b: 0expected_result: 0# test_code.pyimpor…...
VSCode中“Run Code”运行程序时,终端出现中文乱码解决方法
问题描述 在VSCode中“Run Code”运行程序时,终端输出结果出现中文乱码现象: 解决方法 1. 检查系统cmd的默认编码 查看Windows终端当前编码方式的命令: chcp输出结果是一段数字代码,如936,这说明当前的cmd编码方式…...
HarmonyOS 5.0应用开发——列表(List)
【高心星出品】 文章目录 列表(List)列表介绍列表布局设置主轴方向设置交叉轴方向 列表填充分组列表填充 滚动条位置设置滚动位置滚到监听 列表项侧滑 列表(List) 列表介绍 列表作为一种容器,会自动按其滚动方向排列…...
C++设计模式外观模式(Facade)
什么是桥接模式? 桥接模式(Bridge Pattern)是一种结构型设计模式,它的核心目的是解耦抽象部分和实现部分,让它们可以独立变化。在简单的描述中,桥接模式可以让你在不修改原有代码的情况下,分别…...
《Python基础》之Numpy库
目录 简介 一、创建数组 1、根据列表创建数组 2、创建全0数组 3、创建全1数组 4、创建单位矩阵 5、创建随机数数组 二、查看数组的属性 三、 数组的操作 1、索引和切片 2、变形 3、拼接 (1)、vstack() 纵向拼接 (2)、hs…...
Python异步编程与API调用:提高效率与性能的实践指南
引言 在当今的软件开发领域,异步编程已成为提高应用程序性能和响应能力的关键技术。特别是在处理I/O密集型任务,如API调用时,异步编程能够显著提升效率。本文将通过一个具体的示例——使用Python的asyncio和aiohttp库来异步调用APIÿ…...
Zookeeper3.4.14集群安装
Zookeeper3.4.14三节点集群安装 为保证集群高可用,Zookeeper 集群的节点数最好是奇数,最少有三个节点,所以这里搭建一个三个节点的集群。(在一个节点模拟三节点,真实的三节点把ip替换一下即可,按照hadoop案件把网络打…...
电机驱动MCU介绍
电机驱动MCU是一种专为电机控制设计的微控制器单元,它集成了先进的控制算法和高性能的功率输出能力。 电机驱动MCU采用高性能的处理器核心,具有快速的运算速度和丰富的外设接口。它内置了专业的电机控制算法,包括PID控制、FOC(Fi…...
Python 面向对象编程详解
Python 面向对象编程详解 面向对象编程(OOP)是一种编程范式,它使用“对象”来设计软件。在 Python 中,面向对象编程非常强大,允许开发者通过类(class)和对象(object)来模…...
网络技术-不使用K8S情况下哪些方法可搭建服务链编排
在不使用Kubernetes(k8s)(或不使用Docker环境技术的)情况下,搭建服务链编排环境需要依赖其他服务编排和容器化技术,或者采用传统的虚拟机和服务管理方法。以下是一些可能的解决方案: 一、使用其…...
JVM_总结详解
1、CPU和内存的交互 了解jvm内存模型前,了解下cpu和计算机内存的交互情况。【因为Java虚拟机内存模型定义的访问操作与计算机十分相似】 有篇很棒的文章,从cpu讲到内存模型:[什么是java内存模型?] 在计算机中,cpu和内存的交互最…...
go语言 Pool实现资源池管理数据库连接资源或其他常用需要共享的资源
go Pool Pool用于展示如何使用有缓冲的通道实现资源池,来管理可以在任意数量的goroutine之间共享及独立使用的资源。这种模式在需要共享一组静态资源的情况(如共享数据库连接或者内存缓冲区)下非 常有用。如果goroutine需要从池里得到这些资…...
初级数据结构——邻接表
目录 前言一、定义与结构二、特点与性质三、构建方式四、操作与应用五、代码模版六、经典例题[1.——LCP 07. 传递信息](https://leetcode.cn/problems/chuan-di-xin-xi/description/)代码题解 [2.——547. 省份数量](https://leetcode.cn/problems/number-of-provinces/)代码题…...
思维导图+实现一个登录窗口界面
QQ2024122-205851 import sys from PyQt6.QtGui import QIcon, QPixmap, QMovie from PyQt6.QtWidgets import QApplication, QWidget, QLineEdit, QPushButton, QLabel, QVBoxLayout# 封装我的窗口类 class LoginWidget(QWidget):# 构造函数def __init__(self):# 初始化父类su…...
多级缓存设计实践
缓存是什么? 缓存技术是一种用于加速数据访问的优化策略。它通过将频繁访问的数据存储在高速存储介质(如内存)中,减少对慢速存储设备(如硬盘或远程服务器)的访问次数,从而提升系统的响应速度和…...
ElasticSearch学习笔记一
目录 1.ElasticSearch-Head如何启动 2.ElasticSearch-Head创建索引 2.1创建索引时的“分片数”和“副本数”是什么意思? 类比 1:图书馆的书架与备份 类比 2:快递分拣中心与包裹副本 总结 编辑 2.2如何查看现有索引的分片数和备份数 …...
A058-基于Spring Boot的餐饮管理系统的设计与实现
🙊作者简介:在校研究生,拥有计算机专业的研究生开发团队,分享技术代码帮助学生学习,独立完成自己的网站项目。 代码可以查看项目链接获取⬇️,记得注明来意哦~🌹 赠送计算机毕业设计600个选题ex…...
代码设计:设计模式:应对变化
文章目录 概述1.拆分代码2.解耦3.扩展总结概述 代码的设计模式主要为了应对变化 三种代码设计中应对变化的方式 1.拆分代码 2.解耦 3.扩展 1.拆分代码 减小变化对代码的影响 需要拆分代码的几种情况 1.类或方法的代码量巨大,导致代码可读性降低 2.存在复杂的代码,如…...
《Vue 路由导航:打造流畅的单页应用一》
一、Vue Router 简介 Vue Router 是什么? Vue Router 是 Vue.js 官方提供的路由管理器,用于构建单页面应用并实现页面间导航。它基于 Vue 的组件系统构建,通过配置路由将浏览器的 URL 和用户看到的内容绑定起来。当用户在应用中浏览不同页面…...
【xshell连接失败】
xshell用pem连接失败 Warning: Identity file ”open_api_test.ssh not accessible: No such file or directory. Warning: Identity file open_api_test2.pem not accessible: No such file or directory. Permission denied (publickey,gssapi-keyex,gssapi-with-mic). 搞了半…...
说说Elasticsearch拼写纠错是如何实现的?
大家好,我是锋哥。今天分享关于【说说Elasticsearch拼写纠错是如何实现的?】面试题。希望对大家有帮助; 说说Elasticsearch拼写纠错是如何实现的? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 在 Elasticsearch 中&…...
实例讲解MATLAB绘图坐标轴标签旋转
在进行绘图时需要在图片上添加上做标轴的标签,但是当数据量比较多时,例如一天24小时的数据,这时把每个小时显示在左边轴的标签上,文字内容放不下,因此需要将坐标轴标签旋转一定的角度,这样可以更好在图形上…...
Win10+Ubuntu20.04双系统重装Ubuntu22.04单系统
从去年 8 月美化 Ubuntu 系统后一直存在内核错误问题,但因为大部分功能还能正常使用,只是在 apt 时报错,所以一直逃避不想重装,直到最近 12 月新的开始,恰好设置的界面打不开得重装 gnome ,所以下定决心重装…...
eBPF:现代Linux的强大内核扩展技术
eBPF:现代Linux的强大内核扩展技术 eBPF(Extended Berkeley Packet Filter)是一项变革性的技术,它为Linux内核提供了一个灵活的、可编程的方式来处理数据包过滤、网络监控、安全性和系统性能分析等多种任务。 1. eBPF简介 1.1 …...
深度学习-52-AI应用实战之基于Yolo8的目标检测自动标注
文章目录 1 YOLOv81.1 YOLOV8的不同版本1.2 可检测类别1.3 数据说明1.4 网络结构1.5 算法核心步骤2 目标检测的基本原理2.1 安装yolov8(cpu版本)2.2 图片检测2.3 视频检测2.4 自动标注2.5 保存标注结果3 参考附录1 YOLOv8 YOLOv8是一种前沿的计算机视觉技术,它基于先前YOLO版…...
人工智能工作流程概述:从数据到智能决策
目录 一、引言 二、人工智能工作流程概述 (一)数据收集 (二)数据预处理 (三)模型选择与设计 (四)模型训练 (五)模型评估 (六)模…...