Java Converter用法详解
Java Converter是一种设计模式,用于在不同类型的对象之间进行转换。Converter可以实现一对一或一对多的转换,也可以支持自定义的转换规则。Converter的优点是可以减少重复的代码,提高代码的可读性和可维护性,以及解耦不同类型的对象。本文将介绍Java Converter的基本概念,常见的实现方式,以及一些使用场景和示例。
1. Converter接口
Converter接口是Java Converter设计模式的核心,它定义了一个通用的转换方法,接受一个源对象作为参数,返回一个目标对象作为结果。Converter接口的定义如下:
@FunctionalInterface
public interface Converter<S, T> {
/**
* Convert the source object of type {@code S} to target type {@code T}.
* @param source the source object to convert, which must be an instance of {@code S} (or {@code null}) * @return the converted object, which must be an instance of {@code T} (or {@code null})
*/
T convert(S source);
}
Converter接口是一个函数式接口,只有一个抽象方法convert。它使用了泛型参数S和T,分别表示源类型和目标类型。Converter接口可以用于实现任意类型之间的转换,只要提供相应的convert方法的实现即可。
2. Converter实现方式
Java Converter有多种实现方式,根据不同的需求和场景,可以选择合适的方式。以下是一些常见的Converter实现方式:
2.1. Lambda表达式
Lambda表达式是Java 8引入的一种简洁的函数定义方式,可以用于实现函数式接口。由于Converter接口是一个函数式接口,因此可以使用Lambda表达式来实现Converter接口。例如,以下代码使用Lambda表达式实现了一个将String转换为Integer的Converter:
Converter<String, Integer> stringToInteger = s ->Integer.valueOf(s);
Lambda表达式可以省略参数类型、返回类型、花括号等冗余的语法,只需要提供参数名和转换逻辑即可。Lambda表达式的优点是简洁、清晰、易于理解,适合用于实现简单的转换逻辑。
2.2. 方法引用
方法引用是Java 8引入的一种特殊的Lambda表达式,可以直接引用已有的方法来实现函数式接口。方法引用使用::符号来表示,前面是类名或对象名,后面是方法名。方法引用的优点是更加简洁、明确、易于阅读,适合用于已有方法可以满足转换需求的情况。
例如,以下代码使用方法引用实现了一个将String转换为Integer的Converter:
Converter<String, Integer> stringToInteger =Integer::valueOf;
这里使用了Integer类中已有的静态方法valueOf来实现转换逻辑,省略了Lambda表达式中的参数名和箭头符号。
方法引用还可以引用构造方法、实例方法、超类方法等不同类型的方法。例如,以下代码使用构造方法引用实现了一个将String 转换为User对象的Converter:
class User {
private String name;
public User(String name) {
this.name = name;
}
// getter and setter
}
Converter<String, User> stringToUser =User::new;
这里使用了User类中已有的构造方法来实现转换逻辑,省略了Lambda表达式中的new关键字。
2.3. 匿名内部类
匿名内部类是Java中一种常见的创建接口实例的方式,可以在创建对象时直接提供接口中抽象方法的实现。匿名内部类使用new关键字后跟接口名和花括号来表示,花括号中需要提供接口中所有抽象方法的实现。匿名内部类的优点是可以访问外部类中的成员变量和方法,适合用于需要使用外部类中的数据或逻辑的情况。
例如,以下代码使用匿名内部类实现了一个将String转换为Integer的Converter:
Converter<String, Integer> stringToInteger =new Converter<String, Integer>() {
@Override
public Integer convert(String source) {
return Integer.valueOf(source);
}
};
这里使用了new关键字后跟Converter接口名和花括号来创建一个匿名内部类,花括号中提供了convert方法的实现。
2.4. 普通类
json转换对象普通类是Java中最常见的创建对象的方式,可以定义一个类来实现接口,然后使用new关键字来创建该类的对象。普通类的优点是可以定义多个构造方法、成员变量和方法,适合用于实现复杂的转换逻辑或需要保存状态的情况。
例如,以下代码使用普通类实现了一个将String转换为Integer的Converter:
class StringToIntegerConverter implements Converter<String, Integer> {
@Override
public Integer convert(String source) {
return Integer.valueOf(source);
}
}
Converter<String, Integer> stringToInteger =new StringToIntegerConverter();
这里定义了一个StringToIntegerConverter类来实现Converter接口,然后使用new关键字来创建该类的对象。
3. Converter使用场景和示例
Java Converter可以用于不同类型的对象之间的转换,例如:
将基本类型转换为包装类型或反之,例如int和Integer,char和Character等。
将字符串类型转换为数字类型或反之,例如String和Integer,String和Double等。
将日期类型转换为字符串类型或反之,例如Date和String,LocalDate和String等。
将枚举类型转换为字符串类型或反之,例如Enum和String。
将实体类转换为DTO类或反之,例如User和UserDTO。
将集合类型转换为数组类型或反之,例如List和Object[]。
将JSON字符串转换为Java对象或反之,例如String和User。
将XML字符串转换为Java对象或反之,例如String和User。
以下是一些使用Converter进行转换的示例:
3.1. 将字符串类型转换为日期类型
这里定义了一个StringToDateConverter 类来实现Converter 接口,它使用了DateTimeFormatter 来格式化日期字符串。它还提供了一个构造方法来接受日期格式的参数。然后在convert 方法中判断源字符串是否为空,如果不为空则使用LocalDate.parse 方法将其解析为LocalDate 对象。
3.2. 将实体类转换为DTO 类
import
LocalDate ;import DateTimeFormatter ;
public class StringToDateConverter implements Converter <String , LocalDate > {
private DateTimeFormatter formatter;
public StringToDateConverter (String pattern) {
this .formatter = DateTimeFormatter .ofPattern (pattern);
}
@Override
public LocalDate convert (String source) {
if (source == null || source.isEmpty ()) {
return null ;
}
return LocalDate .parse (source, formatter);
}
}
// 测试代码
public class Test {
public static void main (String [] args) {
Converter <String , LocalDate > stringToDate = new StringToDateConverter ("yyyy-MM-dd");
LocalDate date = vert ("2023-08-09");
System .out.println (date); // 2023-08-09
}
}
.ime.format.
public class User {
private Long id;
private String name;
private String password;
private Integer age;
private String email;
// getter and setter
}
public class UserDTO {
private Long id;
private String name;
private Integer age;
// getter and setter
}
public class UserToUserDTOConverter implements Converter <User , UserDTO > {
@Override
public UserDTO convert (User source) {
if (source == null ) {
return null ;
}
UserDTO target = new UserDTO ();
target.setId (Id ());
.fasterxml.jackson.databind.
target.Name());
target.Age());
return target;
}
}
// 测试代码
public class Test {
public static void main(String[] args) {
Converter<User, UserDTO> userToUserDTO =new UserToUserDTOConverter();
User user =new User();
user.setId(1L);
user.setName("Alice");
user.setPassword("123456");
user.setAge(20);
user.setEmail("*****************");
UserDTO userDTO = vert(user);
System.out.println(userDTO); // UserDTO{id=1, name='Alice', age=20}
}
}
这里定义了一个UserToUserDTOConverter类来实现Converter接口,它在convert方法中创建了一个UserDTO对象,并将源User对象中的部分属性复制给目标UserDTO对象。这样可以实现将实体类转换为DTO类的功能,DTO类是一种数据传输对象,用于在不同层之间传递数据,通常只包含部分属性,以减少数据量和保护敏感信息。
3.3. 将JSON字符串转换为Java对象
import ObjectMapper;
public class JsonToUserConverter implements Converter<String, User> {
private ObjectMapper mapper;
public JsonToUserConverter() {
this.mapper =new ObjectMapper();
}
@Override
public User convert(String source) {
if (source ==null|| source.isEmpty()) {
return null;
}
try {
adValue(source, User.class);
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
}
// 测试代码
public class Test {
public static void main(String[] args) {
Converter<String, User> jsonToUser =new JsonToUserConverter();
String json ="
{\"id\":1,\"name\":\"Alice\",\"password\":\"123456\",\"age\":20,\"email\":\"*****************\"}";
User user = vert(json);
System.out.println(user); // User{id=1, name='Alice', password='123456', age=20,
email='*****************'}
}
}
这里定义了一个JsonToUserConverter类来实现Converter接口,它使用了Jackson库中的ObjectMapper类来实现JSON字符串和Java对象之间的转换。它在convert方法中使用adValue方法将源JSON字符串解析为User对象,如果发生异常则返回null。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论