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文章来源:https://uudwc.com/A/BrbNX
import lombok.Data;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class CustomGeneri{
private String date;
private String title;
}
文章来源地址https://uudwc.com/A/BrbNX