PageDTO<T>,PageQuery,BeanUtils,CollUtils的封装

一、PageDTO<T>

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.tianji.common.utils.BeanUtils;
import com.tianji.common.utils.CollUtils;
import com.tianji.common.utils.Convert;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;import java.util.List;
import java.util.function.Function;
import java.util.stream.Collectors;@Data
@NoArgsConstructor
@AllArgsConstructor
@ApiModel(description = "分页结果")
public class PageDTO<T> {@ApiModelProperty("总条数")protected Long total;@ApiModelProperty("总页码数")protected Long pages;@ApiModelProperty("当前页数据")protected List<T> list;public static <T> PageDTO<T> empty(Long total, Long pages) {return new PageDTO<>(total, pages, CollUtils.emptyList());}public static <T> PageDTO<T> empty(Page<?> page) {return new PageDTO<>(page.getTotal(), page.getPages(), CollUtils.emptyList());}public static <T> PageDTO<T> of(Page<T> page) {if(page == null){return new PageDTO<>();}if (CollUtils.isEmpty(page.getRecords())) {return empty(page);}return new PageDTO<>(page.getTotal(), page.getPages(), page.getRecords());}public static <T,R> PageDTO<T> of(Page<R> page, Function<R, T> mapper) {if(page == null){return new PageDTO<>();}if (CollUtils.isEmpty(page.getRecords())) {return empty(page);}return new PageDTO<>(page.getTotal(), page.getPages(),page.getRecords().stream().map(mapper).collect(Collectors.toList()));}public static <T> PageDTO<T> of(Page<?> page, List<T> list) {return new PageDTO<>(page.getTotal(), page.getPages(), list);}public static <T, R> PageDTO<T> of(Page<R> page, Class<T> clazz) {return new PageDTO<>(page.getTotal(), page.getPages(), BeanUtils.copyList(page.getRecords(), clazz));}public static <T, R> PageDTO<T> of(Page<R> page, Class<T> clazz, Convert<R, T> convert) {return new PageDTO<>(page.getTotal(), page.getPages(), BeanUtils.copyList(page.getRecords(), clazz, convert));}@ApiModelProperty(hidden = true)@JsonIgnorepublic boolean isEmpty(){return list == null || list.size() == 0;}
}

二、 PageQuery

2.1 PageQuery代码

import com.baomidou.mybatisplus.core.metadata.OrderItem;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.xxx.common.constants.Constant;
import com.xxx.common.utils.StringUtils;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.experimental.Accessors;import javax.validation.constraints.Min;@Data
@ApiModel(description = "分页请求参数")
@Accessors(chain = true)
public class PageQuery {public static final Integer DEFAULT_PAGE_SIZE = 20;public static final Integer DEFAULT_PAGE_NUM = 1;@ApiModelProperty(value = "页码", example = "1")@Min(value = 1, message = "页码不能小于1")private Integer pageNo = DEFAULT_PAGE_NUM;@ApiModelProperty(value = "每页大小", example = "5")@Min(value = 1, message = "每页查询数量不能小于1")private Integer pageSize = DEFAULT_PAGE_SIZE;@ApiModelProperty(value = "是否升序", example = "true")private Boolean isAsc = true;@ApiModelProperty(value = "排序字段", example = "id")private String sortBy;public int from(){return (pageNo - 1) * pageSize;}public <T> Page<T> toMpPage(OrderItem ... orderItems) {Page<T> page = new Page<>(pageNo, pageSize);// 是否手动指定排序方式if (orderItems != null && orderItems.length > 0) {for (OrderItem orderItem : orderItems) {page.addOrder(orderItem);}return page;}// 前端是否有排序字段if (StringUtils.isNotEmpty(sortBy)){OrderItem orderItem = new OrderItem();orderItem.setAsc(isAsc);orderItem.setColumn(sortBy);page.addOrder(orderItem);}return page;}public <T> Page<T> toMpPage(String defaultSortBy, boolean isAsc) {if (StringUtils.isBlank(sortBy)){sortBy = defaultSortBy;this.isAsc = isAsc;}Page<T> page = new Page<>(pageNo, pageSize);OrderItem orderItem = new OrderItem();orderItem.setAsc(this.isAsc);orderItem.setColumn(sortBy);page.addOrder(orderItem);return page;}public <T> Page<T> toMpPageDefaultSortByCreateTimeDesc() {return toMpPage(Constant.DATA_FIELD_NAME_CREATE_TIME, false);}
}

2.2 使用举例

@EqualsAndHashCode(callSuper = true)
@Data
@ApiModel(description = "互动问题分页查询条件")
public class QuestionPageQuery extends PageQuery {// 用户端查询条件@ApiModelProperty(value = "课程id")private Long courseId;@ApiModelProperty(value = "小节id", example = "1")private Long sectionId;@ApiModelProperty(value = "是否只查询我的问题", example = "1")private Boolean onlyMine;
}----------------------------------------------------------------//1 获取用户id
Long userId = UserContext.getUser();Boolean onlyMine = query.getOnlyMine(); // 是否只查询自己
Long sectionId = query.getSectionId();
Long courseId = query.getCourseId();
//2 分页查询问题表(question)数据
// selecgt * from question  where user_id=?  and course_id =? and section_id=? and hidden= false;
Page<InteractionQuestion> page = this.lambdaQuery().eq(onlyMine, InteractionQuestion::getUserId, userId) // 只查询自己,才拼接条件.eq(courseId != null, InteractionQuestion::getCourseId, courseId) // 传递了 课程,才拼接课程查询.eq(sectionId != null, InteractionQuestion::getSectionId, sectionId)  // 传递了 小节,才拼接小节查询.eq(InteractionQuestion::getHidden, false) // 被管理员隐藏的不显示.page(query.toMpPageDefaultSortByCreateTimeDesc()); // 按照创建日期倒叙排序
List<InteractionQuestion> records = page.getRecords();
if(CollUtils.isEmpty(records)){ // 如果没有return PageDTO.empty(page);
}
// 1.获取用户id
Long userId = UserContext.getUser();
// 2) 分页查询数据库
// select * from learning_lesson where user_id=?  order by create_time desc  limit 5Page<LearningLesson> page = this.lambdaQuery().eq(LearningLesson::getUserId, userId).page(query.toMpPage("latest_learn_time", false));//  mybatis  会把  查询的数据全部封装到 page 中: 数据, 总条数数据集
List<LearningLesson> records = page.getRecords(); // 获取当前页数据
if(CollUtils.isEmpty(records)){return PageDTO.empty(page); // 如果没有数据返回空对象
}

三、BeanUtils

3.1 BeanUtils代码

import cn.hutool.core.bean.BeanUtil;import java.util.List;
import java.util.stream.Collectors;/*** 继承自 hutool 的BeanUtil,增加了bean转换时自定义转换器的功能*/
public class BeanUtils extends BeanUtil {/*** 将原对象转换成目标对象,对于字段不匹配的字段可以使用转换器处理** @param source  原对象* @param clazz   目标对象的class* @param convert 转换器* @param <R>     原对象类型* @param <T>     目标对象类型* @return 目标对象*/public static <R, T> T copyBean(R source, Class<T> clazz, Convert<R, T> convert) {T target = copyBean(source, clazz);if (convert != null) {convert.convert(source, target);}return target;}/*** 将原对象转换成目标对象,对于字段不匹配的字段可以使用转换器处理** @param source  原对象* @param clazz   目标对象的class* @param <R>     原对象类型* @param <T>     目标对象类型* @return 目标对象*/public static <R, T> T copyBean(R source, Class<T> clazz){if (source == null) {return null;}return toBean(source, clazz);}public static <R, T> List<T> copyList(List<R> list, Class<T> clazz) {if (list == null || list.size() == 0) {return CollUtils.emptyList();}return copyToList(list, clazz);}public static <R, T> List<T> copyList(List<R> list, Class<T> clazz, Convert<R, T> convert) {if (list == null || list.size() == 0) {return CollUtils.emptyList();}return list.stream().map(r -> copyBean(r, clazz, convert)).collect(Collectors.toList());}
}
package com.xxx.common.utils;/*** 对原对象进行计算,设置到目标对象中**/
public interface Convert<R,T>{void convert(R origin, T target);
}

3.2 举例

在这里插入图片描述

在这里插入图片描述

    public void save(CourseTeacherSaveDTO courseTeacherSaveDTO) {//1.数据删除条件LambdaUpdateWrapper<CourseTeacherDraft> updateWrapper =Wrappers.lambdaUpdate(CourseTeacherDraft.class).eq(CourseTeacherDraft::getCourseId, courseTeacherSaveDTO.getId());//1.1.数据删除baseMapper.delete(updateWrapper);//2.组装即将插入的数据// List<TeacherInfo> teachersList<CourseTeacherDraft> courseTeacherDrafts =BeanUtils.copyList(courseTeacherSaveDTO.getTeachers(),CourseTeacherDraft.class,(teacherInfo, teacherDraft) -> {//2.1.设置课程idteacherDraft.setCourseId(courseTeacherSaveDTO.getId());//2.2.设置老师idteacherDraft.setTeacherId(teacherInfo.getId());//2.3.设置课程中老师排序teacherDraft.setCIndex(courseTeacherSaveDTO.getTeachers().indexOf(teacherInfo));});//3.批量插入课程的老师信息saveBatch(courseTeacherDrafts);//4.更新课程填写进度courseDraftService.updateStep(courseTeacherSaveDTO.getId(), CourseConstants.CourseStep.TEACHER);}-----------------------------------------------------
@ApiModel("课程老师关系模型")
public class CourseTeacherSaveDTO {@ApiModelProperty("课程id")@NotNull(message = CourseErrorInfo.Msg.COURSE_TEACHER_SAVE_COURSE_ID_NULL)private Long id;@ApiModelProperty("老师id和用户端是否展示,该列表按照界面上的顺序")@NotNull(message = CourseErrorInfo.Msg.COURSE_TEACHER_SAVE_TEACHERS_NULL)
//    @Min(value = 1, message = CourseErrorInfo.Msg.COURSE_TEACHER_SAVE_TEACHERS_NULL)@Size(min = 1, max = 5, message = CourseErrorInfo.Msg.COURSE_TEACHER_SAVE_TEACHERS_NUM_MAX )private List<TeacherInfo> teachers;@Data@ApiModel("老师id和用户端是否显示")public static class TeacherInfo{@ApiModelProperty("老师id")@NotNull(message = CourseErrorInfo.Msg.COURSE_TEACHER_SAVE_TEACHER_ID_NULL)private Long id;@ApiModelProperty("用户端是否展示")@NotNull(message = CourseErrorInfo.Msg.COURSE_TEACHER_SAVE_TEACHER_SHOW)private Boolean isShow;}
}

四、CollUtils

4.1 CollUtils代码

import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.collection.IterUtil;
import com.xxx.common.validate.Checker;import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;/*** 继承自 hutool 的集合工具类*/
public class CollUtils extends CollectionUtil {public static <T> List<T> emptyList() {return Collections.emptyList();}public static <T> Set<T> emptySet() {return Collections.emptySet();}public static <K,V> Map<K, V> emptyMap() {return Collections.emptyMap();}public static <T> Set<T> singletonSet(T t) {return Collections.singleton(t);}public static <T> List<T> singletonList(T t) {return Collections.singletonList(t);}public static List<Integer> convertToInteger(List<String> originList){return CollUtils.isNotEmpty(originList) ? originList.stream().map(NumberUtils::parseInt).collect(Collectors.toList()) : null;}public static List<Long> convertToLong(List<String> originLIst){return CollUtils.isNotEmpty(originLIst) ? originLIst.stream().map(NumberUtils::parseLong).collect(Collectors.toList()) : null;}/*** 以 conjunction 为分隔符将集合转换为字符串 如果集合元素为数组、Iterable或Iterator,则递归组合其为字符串* @param collection 集合* @param conjunction 分隔符* @param <T> 集合元素类型* @return 连接后的字符串* See Also: IterUtil.join(Iterator, CharSequence)*/public static <T> String join(Collection<T> collection, CharSequence conjunction) {if (null == collection || collection.isEmpty()) {return null;}return IterUtil.join(collection.iterator(), conjunction);}public static <T> String joinIgnoreNull(Collection<T> collection, CharSequence conjunction) {if (null == collection || collection.isEmpty()) {return null;}StringBuilder sb = new StringBuilder();for (T t : collection) {if(t == null) continue;sb.append(t).append(",");}if(sb.length() <= 0){return null;}return sb.deleteCharAt(sb.length() - 1).toString();}/*** 集合校验逻辑** @param data 要校验的集合* @param checker 校验器* @param <T> 集合元素类型*/public static  <T> void  check(List<T> data, Checker<T> checker){if(data == null){return;}for (T t : data){checker.check(t);}}/*** 集合校验逻辑** @param data 要校验的集合* @param <T> 集合元素类型*/public static  <T extends Checker<T>> void  check(List<T> data){if(data == null){return;}for (T t : data){t.check();}}/*** 将元素加入到集合中,为null的过滤掉** @param list 集合* @param data 要添加的数据* @param <T> 元素类型*/public static <T> void add(Collection<T> list, T... data) {if (list == null || ArrayUtils.isEmpty(data)) {return;}for (T t : data) {if (ObjectUtils.isNotEmpty(t)) {list.add(t);}}}//将两个集合出现次数相加public static Map<Long, Integer> union(Map<Long, Integer> map1, Map<Long, Integer> map2) {if (CollUtils.isEmpty(map1)) {return map2;} else if (CollUtils.isEmpty(map2)) {return map1;}for (Map.Entry<Long, Integer> entry : map1.entrySet()) {Integer num = map2.get(entry.getKey());map2.put(entry.getKey(), NumberUtils.null2Zero(num) + entry.getValue());}return map2;}public static <T,R> R getFiledOfFirst(List<T> list, Function<T, R> function) {if (CollUtils.isEmpty(list)) {return null;}return function.apply(list.get(0));}
}

/*** 实现后在接口访问时如果接口实现了这个接口* 会被自动自行接口check进行校验**/
public interface Checker<T> {/*** 用于实现validation不能校验的数据逻辑*/default void check(){}default void check(T data){}
}

4.2 checker举例

@ApiModel(description = "章节")
public class CataSaveDTO implements Checker {@ApiModelProperty("章、节、练习id")private Long id;@ApiModelProperty("目录类型1:章,2:节,3:测试")@NotNull(message = "")private Integer type;@ApiModelProperty("章节练习名称")private String name;@ApiModelProperty("章排序,章一定要传,小节和练习不需要传")private Integer index;@ApiModelProperty("当前章的小节或练习")@Size(min = 1, message = "不能出现空章")private List<CataSaveDTO> sections;@Overridepublic void check() {//名称为空校验if(type == CourseConstants.CataType.CHAPTER && StringUtils.isEmpty(name)) {throw new BadRequestException(CourseErrorInfo.Msg.COURSE_CATAS_SAVE_NAME_NULL);}else if(StringUtils.isEmpty(name)){throw new BadRequestException(CourseErrorInfo.Msg.COURSE_CATAS_SAVE_NAME_NULL2);}//名称长度问题if (type == CourseConstants.CataType.CHAPTER && name.length() > 30){throw new BadRequestException(CourseErrorInfo.Msg.COURSE_CATAS_SAVE_NAME_SIZE);}else if(name.length() > 30) {throw new BadRequestException(CourseErrorInfo.Msg.COURSE_CATAS_SAVE_NAME_SIZE2);}if(CollUtils.isEmpty(sections)){throw new BadRequestException("不能出现空章");}}
}
@ApiModel("题目保存模型")
@Data
public class SubjectSaveDTO implements Checker {@ApiModelProperty("题目id,为空新增,不为空更新")private Long id;@ApiModelProperty("名称")@NotNull(message = "题目为空,请设置题目")@Size(max = 200, min = 5, message = "题目长度为5-200")private String name;@ApiModelProperty("所属题目分类")@NotNull(message = "题目分类为空,请设置题目分类")private List<List<Long>> cates;@ApiModelProperty("题目类型")@NotNull(message = "题目类型为空,请设置题目类型")@EnumValid(enumeration = {1,2,3,4,5}, message = "题目类型只有单选题,多选题,不定向选择题,判断题,您的题目超出题纲")private Integer subjectType;@ApiModelProperty("题目难易度")@NotNull(message = "难度不能为空")@EnumValid(enumeration = {1,2,3},message = "题目难度只有简单,中等,困难")private Integer difficulty;@ApiModelProperty("分值")private Integer score;@ApiModelProperty("课程id")private List<Long> courseIds;@ApiModelProperty("选项,最多10个")private List<String> options;@ApiModelProperty("答案,判断题,数组第一个如果是1,代表正确,其他代表错误")@NotNull(message = "题目答案不能为空")private List<Integer> answers;@ApiModelProperty("解析")private String analysis;@Overridepublic void check() {//选择题 单选,多选,不定向选择if(subjectType == SubjectConstants.Type.SIGNLE_CHOICE.getType() ||subjectType == SubjectConstants.Type.MUtiple_CHOICE.getType() ||subjectType == SubjectConstants.Type.NON_DIRECTIONAL_CHOICE.getType()){Integer answerOptionMax = answers.stream().max(Integer::compare).get();//选项最少1个最多10个if(CollUtils.isEmpty(options) || options.size() > 10){throw new BizIllegalException("最少1个选项,最多10个选项");}//选择题答案 不能超过选项数if(answerOptionMax > options.size()){throw new BizIllegalException("存在正确的答案找不到选项");}if(StringUtils.isNotEmpty(analysis)&& (StringUtils.length(analysis) < 5|| StringUtils.length(analysis) > 300)) {throw new BadRequestException("答案解析长度为5-300");}}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/43575.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C#中的MD5摘要算法与哈希算法

文章目录 一、哈希算法基础二、MD5 算法原理三、MD5摘要算法四、哈希算法五、C#实现示例MD5算法示例哈希算法示例字符串MD5值对比 六、总结 一、哈希算法基础 哈希算法是一种单向密码体制&#xff0c;它将任意长度的数据转换成固定长度的字符串。这种转换是不可逆的&#xff0…

IDEA中配置代理,解决Codearts Snap登陆不了的问题

问题描述&#xff1a;在mac电脑中的idea中安装了华为的codearts snap插件&#xff0c;一直登录不了&#xff0c;账号是没问题的&#xff0c;后来我怀疑是我的代理有问题&#xff0c;找到IDEA中的代理设置先是有这个问题“You have JVM property "https.proxyHost" se…

千呼新零售2.0分销商城视频介绍

千呼新零售2.0系统是零售行业连锁店一体化收银系统&#xff0c;包括线下收银线上商城连锁店管理ERP管理商品管理供应商管理会员营销等功能为一体&#xff0c;线上线下数据全部打通。 适用于商超、便利店、水果、生鲜、母婴、服装、零食、百货、宠物等连锁店使用。 详细介绍请…

Android初学者书籍推荐

书单 1.《Android应用开发项目式教程》&#xff0c;机械工业出版社&#xff0c;2024年出版2.《第一行代码Android》第二版3.《第一行代码Android》第三版4.《疯狂Android讲义》第四版5.《Android移动应用基础教程&#xff08;Android Studio 第2版&#xff09;》 从学安卓到用安…

【机器学习】支持向量机与主成分分析在机器学习中的应用

文章目录 一、支持向量机概述什么是支持向量机&#xff1f;超平面和支持向量大边距直觉 二、数据预处理与可视化数据集的基本信息导入必要的库加载数据集数据概况数据可视化特征对的散点图矩阵类别分布条形图平均面积与平均光滑度的散点图变量之间的相关性热图 三、模型训练&am…

在conda的环境中安装Jupyter及其他软件包

Pytorch版本、安装和检验 大多数软件包都是随Anaconda安装的&#xff0c;也可以根据需要手动安装一些其他软件包。 目录 创建虚拟环境 进入虚拟环境 安装Jupyter notebook 安装matplotlib 安装 pandas 创建虚拟环境 基于conda包的环境创建、激活、管理与删除http://t.cs…

podman 替代 docker ? centos Stream 10 已经弃用docker,开始用podman了!

&#x1f468;‍&#x1f393;博主简介 &#x1f3c5;CSDN博客专家   &#x1f3c5;云计算领域优质创作者   &#x1f3c5;华为云开发者社区专家博主   &#x1f3c5;阿里云开发者社区专家博主 &#x1f48a;交流社区&#xff1a;运维交流社区 欢迎大家的加入&#xff01…

浅谈React

forwardRef和useImperativeHandle的联动使用 import React, { useImperativeHandle, useRef } from "react" import { forwardRef } from "react"const CustomInput forwardRef((props, ref) > {const inputRef useRef<HTMLInputElement>(null…

解决MCM功率电源模块EMC的关键

对MCM功率电源而言&#xff0c;由于其工作在几百kHz的高频开关状态&#xff0c;故易成为干扰源。电磁兼容性EMC&#xff08;Electro Magnetic Compatibility&#xff09;&#xff0c;是指设备或系统在其电磁环境中符合要求运行并不对其环境中的任何设备产生无法忍受的电磁干扰的…

浪潮天启防火墙TQ2000远程配置方法SSL-xxx、L2xx 配置方法

前言 本次设置只针对配置VXX&#xff0c;其他防火墙配置不涉及。建议把防火墙内外网都调通后再进行Vxx配置。 其他配置可参考&#xff1a;浪潮天启防火墙配置手册 配置SSLVxx 在外网端口开启SSLVxx信息 开启SSLVxx功能 1、勾选 “启用SSL-Vxx” 2、设置登录端口号&#xff0…

springboot零食盒子-计算机毕业设计源码50658

目 录 1 绪论 1.1 研究背景 1.2研究意义 1.3论文结构与章节安排 2 微信小程序的零食盒子系统分析 2.1 可行性分析 2.2 系统流程分析 2.2.1 数据流程 3.3.2 业务流程 2.3 系统功能分析 2.3.1 功能性分析 2.3.2 非功能性分析 2.4 系统用例分析 2.5本章小结 3 微信…

力扣-排序算法

排序算法&#xff0c;一般都可以使用std&#xff1a;&#xff1a;sort&#xff08;&#xff09;来快速排序。 这里介绍一些相关的算法&#xff0c;巩固记忆。 快速排序 跟二分查找有一丢丢像。 首先选择一个基准元素&#xff0c;一般就直接选择第一个。然后两个指针&#xff0c…

安卓逆向经典案例——XX优品(uniapp)

uni-app逆向 uniapp的目录结构 有一个io文件夹&#xff0c;下面有dcloud uniapp UniApp 可以用于开发 H5 应用&#xff0c;但它不仅仅局限于 H5 应用。UniApp 的特点包括&#xff1a; 1. 跨平台&#xff1a;可以一套代码同时生成适用于多个平台&#xff08;如 iOS、Android、…

Java---数组

乐观学习&#xff0c;乐观生活&#xff0c;才能不断前进啊&#xff01;&#xff01;&#xff01; 我的主页&#xff1a;optimistic_chen 我的专栏&#xff1a;c语言 欢迎大家访问~ 创作不易&#xff0c;大佬们点赞鼓励下吧~ 前言 无论c语言还是java数组都是重中之重&#xff0…

【简历】湖南某一本大学:JAVA实习简历指导,面试通过率比较低

注&#xff1a;为保证用户信息安全&#xff0c;姓名和学校等信息已经进行同层次变更&#xff0c;内容部分细节也进行了部分隐藏 简历说明 这个同学的学校是重点一本院校&#xff0c;这种学校背景我们建议大家尝试投一下大厂&#xff0c;然后投递主体在中厂。但是因为项目经历…

旷野之间12 - 内容创作用的最佳大模型评测

​​​​​​ 我正在做一个项目,需要我找出最适合内容创作的 LLM。我查看了 lmsys 排行榜上的顶级模型,阅读了其他人对这些模型的评价,查看了顶级 LLM 的模型卡,在没有明确答案后,我决定对所有这些 LLM 进行测试,以完成不同的内容创作任务。 评估模型 我想要评估的模型…

在iPhone / iPad上轻松模拟GPS位置 AnyGo for Mac

在iPhone / iPad上轻松模拟GPS位置 AnyGo for Mac AnyGo for Mac是一款专为Mac电脑用户设计的虚拟定位工具。它可以模拟你的GPS位置&#xff0c;让你的设备显示你在任何世界上的任何地方。无论你是想在游戏中虚拟移动&#xff0c;还是在社交媒体上分享虚拟的旅行照片&#xff0…

C 语言中如何实现字符串的拼接?

&#x1f345;关注博主&#x1f397;️ 带你畅游技术世界&#xff0c;不错过每一次成长机会&#xff01; &#x1f4d9;C 语言百万年薪修炼课程 【https://dwz.mosong.cc/cyyjc】通俗易懂&#xff0c;深入浅出&#xff0c;匠心打磨&#xff0c;死磕细节&#xff0c;6年迭代&…

Objective-C 中的 isa 不再是简单的结构体指针

了解 Objective-C 中的 isa 指针内存结构 在 Objective-C 中&#xff0c;isa 指针是对象和类之间的重要桥梁。它不仅帮助运行时系统识别对象的类型&#xff0c;还参与了一些内存和性能优化。本文将深入讲解 isa 指针的内存结构&#xff0c;包括其在早期和现代实现中的演变。 …

Transformer 论文通俗解读:FFN 的作用

在经过前面3节关于 Transformer 论文的解读之后&#xff0c;相信你对提出 Transformer 架构的这篇论文有了一定的了解了&#xff0c;你可以点击下面的链接复习一下前3节的内容。 《Attention is all you need》通俗解读&#xff0c;彻底理解版&#xff1a;part1 《Attention …