当前位置: 首页 > news >正文

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包的链接&#xff0c;需要stdc。 ${PROJECT_SOURCE_DIR}/../jniLibs/${ANDROID_ABI}/liblibde265.a这个路径由于操作过程中copy出现问题&#xff0c;多了一层路径&…...

新一代零样本无训练目标检测

&#x1f3e1;作者主页&#xff1a;点击&#xff01; &#x1f916;编程探索专栏&#xff1a;点击&#xff01; ⏰️创作时间&#xff1a;2024年12月2日21点02分 神秘男子影, 秘而不宣藏。 泣意深不见, 男子自持重, 子夜独自沉。 论文链接 点击开启你的论文编程之旅h…...

神经网络入门实战:(九)分类问题 → 神经网络模型搭建模版和训练四步曲

(一) 神经网络模型搭建官方文档 每一层基本都有权重和偏置&#xff0c;可以仔细看官方文档。 pytorch 官网的库&#xff1a;torch.nn — PyTorch 2.5 documentation Containers库&#xff1a;用来搭建神经网络框架&#xff08;包含所有的神经网络的框架&#xff09;&#xff1b…...

写NFC微信小程序跳转Uri标签

本示例使用的发卡器&#xff1a;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 构建,包括项目模版&#xff0c; 插件&#xff1b; 说到 Java 项目管理&#xff0c;有两个巨头脱颖而出&a…...

【赛博保安】安全日记之常用术语(一)

"企业的信息安全治理水平&#xff0c;直接取决于安全团队人员的技术专业度&#xff0c;而非运营经验值。所谓的技术&#xff0c;并非指渗透和挖洞的能力&#xff0c;而是指软件开发、IT 架构、网络拓扑相关的知识和经验。 站在乙方的角度来看&#xff0c;技术薄弱的安全人…...

设计模式 更新ing

设计模式 1、六大原则1.1 单一设计原则 SRP1.2 开闭原则1.3 里氏替换原则1.4 迪米特法则1.5 接口隔离原则1.6 依赖倒置原则 2、工厂模式 1、六大原则 1.1 单一设计原则 SRP 一个类应该只有一个变化的原因 比如一个视频软件&#xff0c;区分不同的用户级别 包括访客&#xff0…...

008静态路由-特定主机路由

按照如上配置&#xff0c;用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&#xff0c;再经过R2 &#xf…...

MySQL 慢查询日志记录 SQL优化 性能优化 日志查询 Explain

介绍 慢查询日志记录了所有执行时间超过指定参数(long_query_time&#xff0c;单位:秒&#xff0c;默认10秒)的所有SQL语句的日志。MySQL的慢查询日志默认没有开启&#xff0c;需要在MySQL的配置文件(/etc/my.cnf)中配置针对这些慢查询的SQL语句进行优化。 #开启慢查询开关 s…...

VINS_MONO视觉导航算法【三】ROS基础知识介绍

文章目录 其他文章说明ROSlaunch文件基本概念定义用途 文件结构根标签常用标签\<node>\<param>\<rosparam>\<remap>\<include>\<arg>\<group> 示例基本示例嵌套示例 使用方法启动 *.launch 文件传递参数 总结 ROS topicTopic 的基本…...

Python 3 教程第13篇(集合)

Python3 集合 集合&#xff08;set&#xff09;是一个无序的不重复元素序列。 集合中的元素不会重复&#xff0c;并且可以进行交集、并集、差集等常见的集合操作。 可以使用大括号 { } 创建集合&#xff0c;元素之间用逗号 , 分隔&#xff0c; 或者也可以使用 set() 函数创建集…...

cesium 3dtile ClippingPlanes 多边形挖洞ClippingPlaneCollection

原理就是3dtiles里面的属性clippingPlanes 采用ClippingPlaneCollection&#xff0c;构成多边形来挖洞。 其次就是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…...

什么是隐式类型转换?

隐式类型转换&#xff08;Implicit Type Conversion&#xff09;是指编译器在没有明确要求的情况下&#xff0c;自动地将一种类型的值转换为另一种类型。C 语言支持隐式类型转换&#xff0c;这通常发生在表达式运算或函数调用中&#xff0c;以确保操作数或参数的类型兼容性。 隐…...

爬虫专栏第三篇:Python 实战:运用 requests 突破京东商品评论获取难题(含 cookie 处理与编码设置技巧

简介&#xff1a;本文以京东商品评论为例&#xff0c;详细介绍了使用requests库获取网页数据的过程&#xff0c;包括从打开商品评价页面、抓包分析找到评论接口&#xff0c;到处理cookie参数、解决cookie字符串解析问题&#xff0c;以及设置正确的编码以成功获取评论数据&#…...

HCIE:详解OSPF,从基础到高级特性再到深入研究

目录 前言 一、OSPF协议基本原理 简介 基本原理 OSPF路由器类型 OSPF网络类型 OSPF报文类型和封装 OSPF邻居的建立的维护 DR和BDR的选举 伪节点 LSDB的更新 OSPF的配置 二、OSPF的高级特性 虚连接&#xff08;Virtual-Link&#xff09; OSPF的LSA和路由选择 OSPF…...

第六十六条:谨慎使用本地方法

其实在java中有很多都是采用C或C语言实现的比如native这种的本地方法&#xff0c;感兴趣的可以找源代码看看。 Java Native Interface (JNI) 允许Java应用程序可以调用本地方法&#xff08;native method&#xff09;&#xff0c;所谓本地方法是指使用本地程序设计语言&#xf…...

neo4j如何存储关于liquidity structure的层次和关联结构

在 Neo4j 中存储关于流动性结构&#xff08;liquidity structure&#xff09;的层次和关联结构非常适合&#xff0c;因为 Neo4j 是一个基于图的数据库&#xff0c;能够自然地建模和存储复杂的关系和层次结构。下面是如何在 Neo4j 中设计和实现这样的数据模型的详细步骤和示例。…...

45 基于单片机的信号选择与温度变化

目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 基于51单片机&#xff0c;采用DS18B20检测温度&#xff0c;通过三种LED灯代表不同状态。 采用DAC0832显示信号脉冲&#xff0c;通过8位数码管显示温度。 信号脉冲可以根据两个按键分别调整为正弦…...

2、Three.js初步认识场景Scene、相机Camera、渲染器Renderer三要素

三要素之间关系&#xff1a; 有了虚拟场景Scene&#xff0c;相机录像Camera&#xff0c;在相机小屏幕上看到的Renderer Scene当前空间 Mesh人在场景 Camera相机录像 Renderer显示器上 首先先描述下Scene&#xff1a; 这个场景为三要素之一&#xff0c;一切需要展示的东西都需…...

Java基础面试题06:hashCode()和equals()方法的重要性体现在什么地方?

前言 Java中的hashCode()和equals()方法看似是干同一件事&#xff0c;但它们的使用场景和作用却大有不同。为了让程序更高效、更准确地运行&#xff0c;我们需要对这两者有深入的了解&#xff0c;并掌握它们的重写规则。 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&#xff0c;使用safe_load方法读取文件&#xff0c;解析出数据 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”运行程序时&#xff0c;终端输出结果出现中文乱码现象&#xff1a; 解决方法 1. 检查系统cmd的默认编码 查看Windows终端当前编码方式的命令&#xff1a; chcp输出结果是一段数字代码&#xff0c;如936&#xff0c;这说明当前的cmd编码方式…...

HarmonyOS 5.0应用开发——列表(List)

【高心星出品】 文章目录 列表&#xff08;List&#xff09;列表介绍列表布局设置主轴方向设置交叉轴方向 列表填充分组列表填充 滚动条位置设置滚动位置滚到监听 列表项侧滑 列表&#xff08;List&#xff09; 列表介绍 列表作为一种容器&#xff0c;会自动按其滚动方向排列…...

C++设计模式外观模式(Facade)

什么是桥接模式&#xff1f; 桥接模式&#xff08;Bridge Pattern&#xff09;是一种结构型设计模式&#xff0c;它的核心目的是解耦抽象部分和实现部分&#xff0c;让它们可以独立变化。在简单的描述中&#xff0c;桥接模式可以让你在不修改原有代码的情况下&#xff0c;分别…...

《Python基础》之Numpy库

目录 简介 一、创建数组 1、根据列表创建数组 2、创建全0数组 3、创建全1数组 4、创建单位矩阵 5、创建随机数数组 二、查看数组的属性 三、 数组的操作 1、索引和切片 2、变形 3、拼接 &#xff08;1&#xff09;、vstack() 纵向拼接 &#xff08;2&#xff09;、hs…...

Python异步编程与API调用:提高效率与性能的实践指南

引言 在当今的软件开发领域&#xff0c;异步编程已成为提高应用程序性能和响应能力的关键技术。特别是在处理I/O密集型任务&#xff0c;如API调用时&#xff0c;异步编程能够显著提升效率。本文将通过一个具体的示例——使用Python的asyncio和aiohttp库来异步调用API&#xff…...

Zookeeper3.4.14集群安装

Zookeeper3.4.14三节点集群安装 为保证集群高可用&#xff0c;Zookeeper 集群的节点数最好是奇数&#xff0c;最少有三个节点&#xff0c;所以这里搭建一个三个节点的集群。(在一个节点模拟三节点&#xff0c;真实的三节点把ip替换一下即可&#xff0c;按照hadoop案件把网络打…...

电机驱动MCU介绍

电机驱动MCU是一种专为电机控制设计的微控制器单元&#xff0c;它集成了先进的控制算法和高性能的功率输出能力。 电机驱动MCU采用高性能的处理器核心&#xff0c;具有快速的运算速度和丰富的外设接口。它内置了专业的电机控制算法&#xff0c;包括PID控制、FOC&#xff08;Fi…...

Python 面向对象编程详解

Python 面向对象编程详解 面向对象编程&#xff08;OOP&#xff09;是一种编程范式&#xff0c;它使用“对象”来设计软件。在 Python 中&#xff0c;面向对象编程非常强大&#xff0c;允许开发者通过类&#xff08;class&#xff09;和对象&#xff08;object&#xff09;来模…...

网络技术-不使用K8S情况下哪些方法可搭建服务链编排

在不使用Kubernetes&#xff08;k8s&#xff09;&#xff08;或不使用Docker环境技术的&#xff09;情况下&#xff0c;搭建服务链编排环境需要依赖其他服务编排和容器化技术&#xff0c;或者采用传统的虚拟机和服务管理方法。以下是一些可能的解决方案&#xff1a; 一、使用其…...

JVM_总结详解

1、CPU和内存的交互 了解jvm内存模型前&#xff0c;了解下cpu和计算机内存的交互情况。【因为Java虚拟机内存模型定义的访问操作与计算机十分相似】 有篇很棒的文章&#xff0c;从cpu讲到内存模型:[什么是java内存模型&#xff1f;] 在计算机中&#xff0c;cpu和内存的交互最…...

go语言 Pool实现资源池管理数据库连接资源或其他常用需要共享的资源

go Pool Pool用于展示如何使用有缓冲的通道实现资源池&#xff0c;来管理可以在任意数量的goroutine之间共享及独立使用的资源。这种模式在需要共享一组静态资源的情况&#xff08;如共享数据库连接或者内存缓冲区&#xff09;下非 常有用。如果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…...

多级缓存设计实践

缓存是什么&#xff1f; 缓存技术是一种用于加速数据访问的优化策略。它通过将频繁访问的数据存储在高速存储介质&#xff08;如内存&#xff09;中&#xff0c;减少对慢速存储设备&#xff08;如硬盘或远程服务器&#xff09;的访问次数&#xff0c;从而提升系统的响应速度和…...

ElasticSearch学习笔记一

目录 1.ElasticSearch-Head如何启动 2.ElasticSearch-Head创建索引 2.1创建索引时的“分片数”和“副本数”是什么意思&#xff1f; 类比 1&#xff1a;图书馆的书架与备份 类比 2&#xff1a;快递分拣中心与包裹副本 总结 ​编辑 2.2如何查看现有索引的分片数和备份数 …...

A058-基于Spring Boot的餐饮管理系统的设计与实现

&#x1f64a;作者简介&#xff1a;在校研究生&#xff0c;拥有计算机专业的研究生开发团队&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的网站项目。 代码可以查看项目链接获取⬇️&#xff0c;记得注明来意哦~&#x1f339; 赠送计算机毕业设计600个选题ex…...

代码设计:设计模式:应对变化

文章目录 概述1.拆分代码2.解耦3.扩展总结概述 代码的设计模式主要为了应对变化 三种代码设计中应对变化的方式 1.拆分代码 2.解耦 3.扩展 1.拆分代码 减小变化对代码的影响 需要拆分代码的几种情况 1.类或方法的代码量巨大,导致代码可读性降低 2.存在复杂的代码,如…...

《Vue 路由导航:打造流畅的单页应用一》

一、Vue Router 简介 Vue Router 是什么&#xff1f; Vue Router 是 Vue.js 官方提供的路由管理器&#xff0c;用于构建单页面应用并实现页面间导航。它基于 Vue 的组件系统构建&#xff0c;通过配置路由将浏览器的 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拼写纠错是如何实现的?

大家好&#xff0c;我是锋哥。今天分享关于【说说Elasticsearch拼写纠错是如何实现的&#xff1f;】面试题。希望对大家有帮助&#xff1b; 说说Elasticsearch拼写纠错是如何实现的&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 在 Elasticsearch 中&…...

实例讲解MATLAB绘图坐标轴标签旋转

在进行绘图时需要在图片上添加上做标轴的标签&#xff0c;但是当数据量比较多时&#xff0c;例如一天24小时的数据&#xff0c;这时把每个小时显示在左边轴的标签上&#xff0c;文字内容放不下&#xff0c;因此需要将坐标轴标签旋转一定的角度&#xff0c;这样可以更好在图形上…...

Win10+Ubuntu20.04双系统重装Ubuntu22.04单系统

从去年 8 月美化 Ubuntu 系统后一直存在内核错误问题&#xff0c;但因为大部分功能还能正常使用&#xff0c;只是在 apt 时报错&#xff0c;所以一直逃避不想重装&#xff0c;直到最近 12 月新的开始&#xff0c;恰好设置的界面打不开得重装 gnome &#xff0c;所以下定决心重装…...

eBPF:现代Linux的强大内核扩展技术

eBPF&#xff1a;现代Linux的强大内核扩展技术 eBPF&#xff08;Extended Berkeley Packet Filter&#xff09;是一项变革性的技术&#xff0c;它为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版…...

人工智能工作流程概述:从数据到智能决策

目录 一、引言 二、人工智能工作流程概述 &#xff08;一&#xff09;数据收集 &#xff08;二&#xff09;数据预处理 &#xff08;三&#xff09;模型选择与设计 &#xff08;四&#xff09;模型训练 &#xff08;五&#xff09;模型评估 &#xff08;六&#xff09;模…...