java List使用Map泛型和使用自定义泛型

1 Map 泛型

// 创建一个 List,用于存储多个 Map
List<Map<String, Object>> dataList = new ArrayList<>();

1.1打印出来

[{date=2023-07-21, title=公告}, {date=2023-07-21, title=公告}, {date=2023-07-21, title=公告}, {date=2023-07-21, title=公告}, {date=2023-07-21, title=公告}, {date=2023-07-21, title=公告}]

1.2 完整代码

public static void main(String[] args) {

    public class GetNe {
    String url = "https://www.xxx.com";
    try {
        // 创建一个 List,用于存储多个 Map
       List<Map<String, Object>> dataList = new ArrayList<>();
 
       // 遍历每个 <li> 元素并获取文字内容
        for (Element liElement : liElements) {
          // 获取标题和日期的元素
          Element titleElement = liElement.selectFirst("div.index_title__6wUnB");
          Element dateElement = liElement.selectFirst("div.index_date__7jmiW");
 
          // 获取标题和日期的文本内容
          if (titleElement != null) {
            String title = titleElement.text();
            String date = dateElement.text();
 
            // 创建一个 Map,用于存储属性
            Map<String, Object> item = new HashMap<>();

            // 添加属性
            item.put("title", title);
            item.put("date", date);

            // 将 Map 添加到 List 中
            dataList.add(item);
        }
    System.out.println(articles);
    }} catch (IOException e) {
      e.printStackTrace();
    }

    }
}

2 自定义泛型

2.1 自定义类



  static class Article {
    private String title; // 全类作用域变量 --> 成员变量
    private String date;

    public Article(String title, String date) { // 构造方法 用来 创建对象并初始化对象的属性
      this.title = title; // 这里用this 是因为 参数和成员变量相同 
      this.date = date;
    }

    public String getTitle() {
      return title;
    }

    public String getDate() {
      return date;
    }
  }

// 如果不用 this可以改成


  static class Article {
    private String title; // 全类作用域变量 --> 成员变量
    private String date;

    public Article(String a, String b) {
      title = a;
      date = b;
    }

    public String getTitle() {
      return title;
    }

    public String getDate() {
      return date;
    }
  }
在构造方法中,当参数名与成员变量名相同时,使用 this 关键字可以帮助区分参数和成员变量。

在你提供的示例代码中,this.title = title; 和 this.date = date; 表示将构造方法的参数 title 和 date 分别赋值给类的成员变量 title 和 date。

通过使用 this 关键字,可以明确指定要操作的是当前对象的成员变量,而不是局部变量(在这种情况下是构造方法的参数)。这样做是为了避免混淆和歧义,同时确保正确地初始化对象的属性。

当局部变量和成员变量同名时,使用 this 可以显式地指明要操作的是成员变量,而不是局部变量。这样可以确保代码的可读性和准确性,并避免潜在的错误。

总之,使用 this 关键字可以帮助区分成员变量和局部变量,以便正确地初始化对象属性,并避免混淆和歧义。
当成员变量和方法参数的名称不相同时,可以直接使用变量名进行赋值,而不需要使用 this 关键字。

在你提供的示例代码中,构造方法的参数名为 a 和 b,而成员变量的名称为 title 和 date。因为它们的名称不相同,所以可以直接使用变量名进行赋值。

所以,你可以在构造方法中使用 title = a; 和 date = b; 来将参数赋值给成员变量,而不需要使用 this 关键字。

需要注意的是,当成员变量和方法参数的名称相同时,为了明确指定要操作的是成员变量,而不是方法参数,你需要使用 this 关键字。这样可以避免混淆和歧义。

总结起来,如果成员变量和方法参数的名称不相同,可以直接使用变量名进行赋值;如果名称相同,则需要使用 this 关键字来指明要操作的是成员变量。

2.2 调用 Article 类中的构造方法 public Article(String title, String date)创建对象并初始化对象的属性

 Article article = new Article(title, date);

3 Map泛型和 自定义泛型区别,一个添加得对象固定 一个添加得对象灵活

这两种方法的区别在于数据的组织方式和访问方式。

使用 List<Article> 的方法:

首先,定义了一个名为 Article 的类,该类有一个构造函数和两个获取属性的方法。
创建一个 Article 对象,并通过构造函数传入标题和日期。
将创建的 Article 对象添加到 List<Article>(即 articles)中。
这种方法通过创建一个自定义的 Article 类来封装标题和日期的信息,并使用 List 来存储多个 Article 对象。使用这种方法,你可以方便地访问和操作每个 Article 对象的属性,例如获取标题和日期。

使用 List<Map<String, Object>> 的方法:

首先,定义了一个 List,其中每个元素都是一个 Map 对象。
创建一个 Map 对象,并将标题和日期作为键值对存储在其中。
将创建的 Map 对象添加到 List<Map<String, Object>>(即 dataList)中。
这种方法使用了一个 List 来存储多个 Map 对象,每个 Map 对象都包含了标题和日期作为键值对。使用这种方法,你可以通过索引访问每个 Map 对象,并通过键来获取对应的值。

总的来说,使用自定义类的方式(即第一种方法)可以更加直观和类型安全地访问和操作属性,因为你可以直接调用对象的方法来获取属性。而使用 List<Map<String, Object>> 的方式(即第二种方法)则更加灵活,因为你可以根据需要在 Map 中添加或移除任意键值对,但需要手动进行类型转换。

选择哪种方法取决于具体的需求和场景。如果每个元素都有固定的属性,并且需要进行属性的具体操作,那么使用自定义类的方式更合适。如果元素的属性不固定,或者只需要简单地存储和获取属性,那么使用 List<Map<String, Object>> 的方式更方便。
自定义泛型主要用于确定集合中元素的类型,而不是键值对的内容。它可以确保在编译期间进行类型检查,以防止插入不兼容的类型。但是,它不会限制元素的内容或键值对。

例如,在一个自定义泛型的 List 中,你可以确保所有的元素都是 String 类型,但并不能保证它们是相同的键。每个元素仍然可以包含不同的键。

同样地,Map 是一种键值对的集合,其中每个键都是唯一的。这意味着在 Map 中,键必须是唯一的,不能重复。自定义泛型并不能直接影响 Map 中的键。

如果你想要确保 List 中每个对象都是相同的键,你需要在代码中进行逻辑判断和处理。如果你想要 Map 中对象可以有不同的键,你可以使用不同的键值对来构建 Map。

所以,自定义泛型并不能直接保证 List 中每个对象都是相同的键,也不能保证 Map 中的对象可以有不同的键。它主要用于提供编译时期的类型安全性。对于集合中元素的内容或键值对的关系,需要通过其他逻辑来保证。

4 要打印出形如 [ {自定义泛型},{自定义泛型},{自定义泛型}] 的格式,你可以使用自定义泛型的类或方法,并重写其 toString() 方法。

@Override
    public String toString() {
        return "{date=" + date + ", title=" + title + "}";
    }

5 完整代码

public static void main(String[] args) {
    String url = "https://www.xxx.com";
    try {
// 创建一个 List 来存储结果
      List<Article> articles = new ArrayList<>();
 
// 遍历每个 <li> 元素并获取文字内容
        for (Element liElement : liElements) {
          // 获取标题和日期的元素
          Element titleElement = liElement.selectFirst("div.index_title__6wUnB");
          Element dateElement = liElement.selectFirst("div.index_date__7jmiW");
 
          // 获取标题和日期的文本内容
          if (titleElement != null) {
            String title = titleElement.text();
            String date = dateElement.text();
 
            // 创建 Article 对象并添加到结果列表
            Article article = new Article(title, date);
            articles.add(article);
          }
        }
    System.out.println(articles);
    }} catch (IOException e) {
      e.printStackTrace();
    }


static class Article {
    private String title;
    private String date;

    public Article(String title, String date) {
      this.title = title;
      this.date = date;
    }

    public String getTitle() {
      return title;
    }

    public String getDate() {
      return date;
    }

    @Override
    public String toString() {
      return "{date=" + date + ", title=" + title + "}";
    }
  }

5 自定义泛型使用Lombok --> 创建一个entity

import lombok.Data;

@Data
@NoArgsConstructor
@AllArgsConstructor
public class CustomGeneri{
    private String date;
    private String title;
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值