C# 入坑JAVA 潜规则 注解 列表 listMch,该列表存储了一个映射(Map)的集合 等 入门系列3

news2024/10/5 1:38:02

java注解 好像和C# 特性 差不多

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor

在Java中,@Data@Builder@NoArgsConstructor@AllArgsConstructor是Lombok库提供的注解,它们用于简化Java对象的创建和处理。Lombok是一个流行的Java库,旨在减少样板代码的编写,让开发者能够更专注于业务逻辑。下面是这些注解的简要说明:

  1. @Data

    • 这是一个聚合注解,它自动为类生成getter和setter方法、toString()equals()hashCode()方法。它还包含了@ToString@EqualsAndHashCode@Getter@Setter@RequiredArgsConstructor的功能。
  2. @Builder

    • 这个注解用于在类上创建一个builder模式的构建器,允许通过链式调用来设置对象的属性。使用@Builder注解可以很容易地创建对象,特别是当对象有很多属性时。
  3. @NoArgsConstructor

    • 这个注解让Lombok为类生成一个无参的构造函数。这对于创建没有初始值的对象实例很有用。
  4. @AllArgsConstructor

    • 这个注解让Lombok为类生成一个包含所有属性的构造函数。这对于创建完全初始化的对象实例很有用。

这些注解通常用于模型类或DTO(数据传输对象),以减少手动编写常见方法的时间。例如,一个使用这些注解的简单类可能看起来像这样:

import lombok.Data;
import lombok.Builder;
import lombok.NoArgsConstructor;
import lombok.AllArgsConstructor;

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class Person {
    private String name;
    private int age;
    private String email;
}

在这个例子中,Person类将自动拥有以下功能:

  • Getter和Setter方法
  • toString()equals()hashCode()方法
  • 一个无参构造函数
  • 一个包含所有属性的构造函数
  • 一个builder模式的构建器

使用这些注解,你可以这样创建Person对象:

Person person = new Person();
Person personWithAllArgsConstructor = new Person("John Doe", 30, "john.doe@example.com");
Person personWithBuilder = Person.builder()
                                  .name("Jane Doe")
                                  .age(25)
                                  .email("jane.doe@example.com")
                                  .build();

请注意,要使用Lombok注解,你需要在项目中添加Lombok依赖,并在IDE中安装相应的插件,以便正确地识别和处理这些注解。

java String 变LocalDateTime

//2024-09-29 12:30
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
LocalDateTime dateTime = LocalDateTime.parse(createReqVO.getSolDeliveryDate(), formatter);
order.setSolDeliveryDate(dateTime);

JAVA 集合

List<Map<String, Object>> listMch = new ArrayList<>();
        Map<String, Object> mch1 = new HashMap<>();

List<Map<String, Object>> listMch = new ArrayList<>();
        Map<String, Object> mch1 = new HashMap<>();
        mch1.put("mchName", "海口");
        mch1.put("userId", 0);
        mch1.put("mchId", 4);
        mch1.put("warehouseId", 0);
        listMch.add(mch1);

您提供的代码是Java语言的一段示例,它创建了一个列表 listMch,该列表存储了一个映射(Map)的集合,每个映射代表一个商户(mch)的信息。然后,代码创建了一个 HashMap 实例 mch1,并向其中添加了几个键值对来存储特定商户的信息,最后将这个映射添加到了列表 listMch 中。

这里是代码的详细解释:

  1. List<Map<String, Object>> listMch = new ArrayList<>();

    • 这行代码创建了一个 ArrayList,它的泛型参数是 Map<String, Object>。这意味着 listMch 可以存储 Map 对象的列表,其中每个 Map 的键是 String 类型,值是 Object 类型。
  2. Map<String, Object> mch1 = new HashMap<>();

    • 这行代码创建了一个 HashMap 实例 mch1,它也是键值对的集合,键是 String 类型,值是 Object 类型。
  3. mch1.put("mchName", "海口");

    • 这行代码向 mch1 映射中添加了一个键值对,键是 "mchName",值是字符串 "海口"
  4. mch1.put("userId", 0);

    • 向 mch1 映射中添加了另一个键值对,键是 "userId",值是整数 0
  5. mch1.put("mchId", 4);

    • 再次向 mch1 映射中添加键值对,键是 "mchId",值是整数 4
  6. mch1.put("warehouseId", 0);

    • 向 mch1 映射中添加最后一个键值对,键是 "warehouseId",值是整数 0
  7. listMch.add(mch1);

    • 最后,这行代码将填充好的 mch1 映射添加到 listMch 列表中。

这段代码通常用于初始化数据,可能用于测试、数据模型的演示或者在应用程序中创建一个包含商户信息的列表。每个映射可以看作是数据库中的一行记录或者是一个JSON对象。在实际的应用程序中,这些数据可能会被用来填充用户界面、进行业务逻辑处理或者通过网络发送到其他服务。

JAVA 集合 再包一层集合

Map<String, List<Map<String, Object>>> result = new HashMap<>();

result.put("listMch", listMch);

在您提供的代码片段中,您创建了一个类型为 Map<String, List<Map<String, Object>>>result 变量,并将其实例化为一个 HashMap。然后,您将之前创建的 listMch(它是一个 List<Map<String, Object>> 类型的变量)添加到 result 映射中,键为 "listMch"

这里是代码的详细解释:

  1. Map<String, List<Map<String, Object>>> result = new HashMap<>();

    • 这行代码创建了一个 HashMap 实例 result。这个映射的键是 String 类型,值是 List<Map<String, Object>> 类型。这意味着 result 可以存储一个或多个键值对,其中每个键都映射到一个列表,列表中的每个元素都是一个映射(Map),映射的键和值都是 Object 类型。
  2. result.put("listMch", listMch);

    • 这行代码调用 result 映射的 put 方法,将键 "listMch" 和值 listMch 添加到映射中。这里的 listMch 是一个之前定义的 List<Map<String, Object>> 类型的变量,它包含了商户信息的列表。

这段代码通常用于将数据组织成层次结构,以便于后续处理或传输。例如,您可能需要将这些数据发送到前端应用程序,或者在内部逻辑中使用这些数据。

在实际应用中,result 映射可以被序列化为JSON格式,以便于通过网络发送,或者在不同的系统和组件之间进行数据交换。例如,如果您使用Jackson或Gson这样的JSON库,您可以轻松地将 result 转换为JSON字符串:

import com.fasterxml.jackson.databind.ObjectMapper;

// ...

ObjectMapper objectMapper = new ObjectMapper();
String jsonString = objectMapper.writeValueAsString(result);
System.out.println(jsonString);

多维数据 属性规格

/** * 属性数组,JSON 格式 */
 @TableField(typeHandler = JacksonTypeHandler.class) 
private List<Property> properties;

/**
 * 商品属性
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
public static class Property {

    /**
     * 属性编号
     * 关联 {@link ProductPropertyDO#getId()}
     */
    private Long propertyId;
    /**
     * 属性名字
     * 冗余 {@link ProductPropertyDO#getName()}
     *
     * 注意:每次属性名字发生变化时,需要更新该冗余
     */
    private String propertyName;

    /**
     * 属性值编号
     * 关联 {@link ProductPropertyValueDO#getId()}
     */
    private Long valueId;
    /**
     * 属性值名字
     * 冗余 {@link ProductPropertyValueDO#getName()}
     *
     * 注意:每次属性值名字发生变化时,需要更新该冗余
     */
    private String valueName;

}

在Java中,如果你想要循环遍历一个List<ProductPropertyValueDetailRespDTO>列表,并查找其中skuId属性值不一样的对象,你可以使用一个简单的for循环或者forEach循环来实现。以下是两种常见的方法:

JAVA  forEach循环list对象 set 更新list某属性值

import java.util.List;

// 假设你有一个List<ProductPropertyValueDetailRespDTO>类型的列表
List<ProductPropertyValueDetailRespDTO> list = ...;

// 使用forEach循环遍历列表
list.forEach((dto, index) -> {
    if (index > 0 && !dto.getSkuId().equals(list.get(index - 1).getSkuId())) {
        // 找到skuId属性值不一样的对象
        System.out.println("找到skuId属性值不一样的对象: " + dto);
    }
});
if(sku.getProperties()!=null)
{
    sku.getProperties().forEach(t->t.setSkuId(id));
} 

在这个例子中,forEach循环提供了当前遍历到的对象dto和它的索引index。通过比较当前对象的skuId与前一个对象的skuId(通过索引index - 1获取),可以找到skuId属性值不一样的对象。

JAVA For使用传统的for循环list对象

import java.util.List;

// 假设你有一个List<ProductPropertyValueDetailRespDTO>类型的列表
List<ProductPropertyValueDetailRespDTO> list = ...;

// 假设你有一个引用,用于保存上一个遍历到的对象
ProductPropertyValueDetailRespDTO previousDto = null;

for (ProductPropertyValueDetailRespDTO dto : list) {
    if (previousDto != null && !dto.getSkuId().equals(previousDto.getSkuId())) {
        // 找到skuId属性值不一样的对象
        System.out.println("找到skuId属性值不一样的对象: " + dto);
    }
    previousDto = dto;
}
if(sku.getProperties()!=null)
{
    List<CartDO> cartList = cartMapper.selectListByUserIdAndSpuId(userId,cart.getSpuId());
    for (CartDO dto : cartList) {
        if (!cart.getSkuId().equals(dto.getSkuId())) {
                throw exception(CARD_ITEM_NOTDOUBLE_FOUND);
        }
    }
}

在这个例子中,previousDto用于保存上一个遍历到的ProductPropertyValueDetailRespDTO对象。在每次循环中,都会检查当前对象的skuId是否与上一个对象的skuId不同。如果不同,就表示找到了一个skuId属性值不一样的对象。

疑问:为什么 Controller 分成 Admin 和 App 两种?

提供给 Admin 和 App 的 RESTful API 接口是不同的,拆分后更加清晰。

疑问:为什么 VO 分成 Admin 和 App 两种?

相同功能的 RESTful API 接口,对于 Admin 和 App 传入的参数、返回的结果都可能是不同的。例如说,Admin 查询某个用户的基本信息时,可以返回全部字段;而 App 查询时,不会返回 mobile 手机等敏感字段。

疑问:为什么 DO 不作为 Controller 的出入参?

  1. 明确每个 RESTful API 接口的出入参。例如说,创建部门时,只需要传入 name、parentId 字段,使用 DO 接参就会导致 type、createTime、creator 等字段可以被传入,导致前端同学一脸懵逼。
  2. 每个 RESTful API 有自己独立的 VO,可以更好的设置 Swagger 注解、Validator 校验规则,而让 DO 保持整洁,专注映射好数据库表。

当前时间

LocalDateTime.now()

项目备注  当前登入人

getLoginUserId()

插件设置

代码热加载

在日常开发中,我们需要经常修改 Java 代码,手动重启项目,查看修改后的效果。如果在项目小时,重启速度比较快,等待的时间是较短的。但是随着项目逐渐变大,重启的速度变慢,等待时间 1-2 min 是比较常见的。

这样就导致我们开发效率降低,影响我们的下班时间,哈哈哈~

那么是否有方式能够实现,在我们修改完 Java 代码之后,能够不重启项目呢?答案是有的,通过 代码热加载 的方式。实现方案有三种:

  1. spring-boot-devtools【不推荐】
  2. IDEA 自带 HowSwap 功能【推荐】
  3. JRebel 插件【最推荐】

1. spring-boot-devtools

spring-boot-devtools (opens new window)是 Spring Boot 提供的开发者工具,它会监控当前应用所在的 classpath 下的文件发生变化,进行自动重启

devtools 存在重启速度较慢的问题,所以不推荐!

#2. IDEA 自带 HowSwap 功能

该功能是 IDEA Ultimate 旗舰版的专属功能,不支持 IDEA Community 社区版。

#2.1 如何使用

① 设置 Spring Boot 启动类,开启 HotSwap 功能。如下图所示:

IDEA 配置热加载

② Debug 运行该启动类,等待项目启动完成。

③ 每次修改 Java 代码后,点击左下角的「热加载」按钮,即可实现代码热加载。如下图所示:

IDEA 代码热加载

#2.2 存在问题

IDEA 自带 HowSwap 功能,支持比较有限,很多修改都不支持。例如说:

  • 只能增加方法或字段但不可以减少方法或字段
  • 只能增加可见性不能减少
  • 只能维持已有方法的签名而不能修改等等。

你可以认为,只支持方法内的代码修改热加载。

如果想要相对完美的方案,建议使用 JRebel 插件。

#3. JRebel 插件【最推荐】

JRebel 插件是目前最好用的热加载插件,它支持 IDEA Ultimate 旗舰版、Community 社区版。

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

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

相关文章

java部分总结

一、Java语言发展简史 Java 语言源于 1991 年 4 月&#xff0c; Sun 公司 James Gosling 博士 领导的绿色计划 (Green Project) 开始启动&#xff0c;此计划最 初的目标是开发一种能够在各种消费性电子产品( 如机顶盒、冰箱、收音机等 ) 上运行的程序架构。这个就是 Jav…

基于Pulid-Flux一致性换脸

Pulid-Flux 简介 Pulid-Flux是风格一致性保持和迁移组件&#xff0c;是字节Pulid团队继SDXL的Pulid版本沉淀基础上再次出发布的PuLID-FLUX-v0.9.0 Flux版本风格一致性组件。能够提供了一个无需调整的身份ID一致性和定制化解决方案&#xff0c;能够被应用于风格一致性保持领域包…

如何写出更牛的验证激励

前言 芯片验证是为了发现芯片中的错误而执行的过程&#xff0c;它是一个破坏性的过程。完备的验证激励可以更有效地发现芯片错误&#xff0c;进而缩短验证周期。合格的验证激励必须能产生所有可能的验证场景(完备性)&#xff0c;包括合法和非法的场景&#xff0c;并保持最大的…

Stable Diffusion绘画 | 来训练属于自己的模型:炼丹启动

经过前面几轮辛苦的准备工作之后&#xff0c;现在开始进入终篇的炼丹环节。 在「上传素材」页面&#xff0c;点击「开始训练」&#xff1a; 可以在「查看进度-进度」中&#xff0c;查看模型训练的整体进度&#xff1a; 求助&#xff01;&#xff01;&#xff01;操作「开始训练…

date:10.4(Content:Mr.Peng)( C language practice)

void reverse(char* p, int len) {char* left p;char* right p len - 2;while (left < right){char* temp left;*left *right;//当*left*right后&#xff0c;*temp已经被改为f了*right *temp;//你再*temp赋值给*right时&#xff0c;已经没用了left;right--;}}int main…

前端学习第三天笔记 JavaScript JavaScript的引入 数据类型 运算符 条件语句 字符串

这里写自定义目录标题 JavaScriptJavaScript引入到文件嵌入到HTML文件中引入本地独立js文件引入网络来源文件 JavaScript的注释方式嵌入在HTML文件中的注释JavaScript的输出方式数据类型原始类型&#xff08;基础类型&#xff09;合成类型&#xff08;复合类型&#xff09; 运算…

Github优质项目推荐-第二期

文章目录 Github优质项目推荐 - 第二期一、【hello-algo】&#xff0c;96.1k stars - 算法与数据结构动画图解二、【tabby】&#xff0c;58.6k stars - ssh工具三、【mem0】&#xff0c;22.1k stars - 大模型长期记忆四、【HivisionIDPhotos】&#xff0c;10.6k stars - AI证件…

多智能体协作强化学习中的知识共享

本文提出了一种名为谨慎乐观知识共享&#xff08;CONS&#xff09;的新方法&#xff0c;用于解决合作多智能体强化学习&#xff08;MARL&#xff09;中的知识共享问题。针对传统的行动建议方法可能导致团队探索受阻的情况&#xff0c;即经验丰富的智能体会分享其知识而较不成熟…

【C++算法】10.滑动窗口_长度最小的子数组

文章目录 题目链接&#xff1a;题目描述&#xff1a;解法C 算法代码&#xff1a;图解 题目链接&#xff1a; 209. 长度最小的子数组 题目描述&#xff1a; 解法 解法一&#xff1a;暴力求解&#xff08;会超时&#xff09; 暴力枚举出所有子数组的和。 查找子数组n2&#xff0…

03:(寄存器开发)OLED的简单使用

OLED的简单使用 将江科大的标准库开发OLED的代码进行移植&#xff0c;修改的部分代码如下&#xff1a; /*引脚配置*/ //#define OLED_W_SCL(x) GPIO_WriteBit(GPIOB, GPIO_Pin_8, (BitAction)(x)) //#define OLED_W_SDA(x) GPIO_WriteBit(GPIOB, GPIO_Pin_9, (BitAction)(x))…

mybatis-plus使用总结

基本使用 mybatis-plus依赖 <!-- mybatis-plus开始 --><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.7</version></dependency><dependency>&l…

D27【 python 接口自动化学习】- python 基础之判断与循环

day27 判断和循环中常见错误 学习日期&#xff1a;20241004 学习目标&#xff1a;判断与循环&#xfe63;-38 避坑指南&#xff1a;判断和循环中的常见错误 学习笔记&#xff1a; 循环过程中改变遍历次数 遍历中修改列表导致误操作 循环嵌套中的缩进导致运行语句有差别 总结…

17 链表——21. 合并两个有序链表 ★

17 链表 21. 合并两个有序链表 将两个升序链表合并为一个新的升序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1: 输入:l1 = [1,2,4], l2 = [1,3,4] 输出:[1,1,2,3,4,4] 算法设计: 合并两个有序链表,并保持有序性,可以采用迭代法和递归法两种…

小白必看web专题!渗透测试还是src?

大家好&#xff0c;我是Dest1ny&#xff01; 今天是回答问题的&#xff0c;有小伙伴私信我&#xff1a; 渗透测试还是src&#xff1f; 今天回答一下&#xff01; 渗透测试&#xff08;Penetration Testing&#xff09;&#xff1a; 渗透测试是一种模拟真实攻击者的技术手段&…

Vue3+TS项目 - ref和useTemplateRef获取组件实例

在Vue2中&#xff0c;子组件使用的是选项式 API &#xff0c;被引用的组件实例和该子组件的 this 完全一致&#xff0c;这意味着父组件对子组件的每一个属性和方法都有完全的访问权。这使得在父组件和子组件之间创建紧密耦合的实现细节变得很容易&#xff0c;当然也因此&#x…

java相关新技术

Java作为一种广泛应用的编程语言&#xff0c;其新技术层出不穷&#xff0c;为开发者提供了更多的工具和框架来构建高效、可扩展的应用程序。以下是一些当前比较热门的Java新技术 Java 17及更高版本&#xff1a; Java平台持续更新&#xff0c;每个新版本都带来了性能改进和新特…

C++学习笔记之类对象(一)

C学习笔记之类&对象&#xff08;一&#xff09; https://www.runoob.com/cplusplus/cpp-classes-objects.html 类是C的核心特性&#xff0c;为用户自定义的数据类型&#xff0c;可以在其中放入数据和函数作为成员&#xff0c;并且以此为模板&#xff0c;创建多个对象个体进…

三维世界的魅力:探索开源的Three.js案例

三维世界的魅力&#xff1a;探索开源的Three.js案例 原生Three.js 和 Cesium.js 案例 - 不断 - 只做开源 。 引言 在这个数字化时代&#xff0c;三维技术已经成为我们生活中不可或缺的一部分。无论是在游戏、电影制作、建筑设计还是虚拟现实中&#xff0c;三维技术都发挥…

ARM Assembly: 第8课 branching

branch causes a branch to a target address. The "B" mnemonic signifies an unconditional branch. 单个的B表示进入一个无条件的分支&#xff0c;而含条件的分支通常可以基于APSR 条件flag进行指令的执行。比如&#xff0c;基于condition flag z是否为1, 我们可…