场景
众所周知,我们Java程序员在写一些方法的时候经常被迫写一些所谓的Dto,用来封装特定方法的返回值,比如return xxxDto;
但是在业务场景逐渐复杂的情况下,本来Dto定义的就很多,而且有的封装Dto的就不是很有必要,于是我们就可以使用Tuple
代替
Tuple和我们定义的Dto 的最大的区别就是,Tuple能够将返回的数据封装在对应的泛型中,而且定义了一个Tuple后,在多个不同的业务场景下都可使用
案例
/**
* 是否能打折,积分1,积分2
**/
private Tuples.Tuple3<Boolean, BigDecimal, BigDecimal> getDiscountInfo(String buyerId) {
/* 获取用户信息 */
UserInfo userInfo = UserService.getuserInfoById(buyerId);
/* 获取用户类型 */
String type = userInfo.getUserType();
/* 用户类型=1,打折 */
if(type = "1"){
return new Tuples.Tuple3<>(true,userInfo.getPoint1(),userInfo.getPoint2());
}else{
/* 用户类型=2,不打折 */
return new Tuples.Tuple3<>(false,userInfo.getPoint1(),userInfo.getPoint2());
}
}
代码
为了代码的整洁性,这里我使用了lombok的依赖
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.12</version>
</dependency>
然后在我们的项目中加入如下代码
import lombok.AllArgsConstructor;
import lombok.Data;
import java.io.Serializable;
public class Tuples {
@Data
@AllArgsConstructor
public static class Tuple2<R1, R2> implements Serializable {
private R1 r1;
private R2 r2;
}
@Data
@AllArgsConstructor
public static class Tuple3<R1, R2, R3> implements Serializable {
private R1 r1;
private R2 r2;
private R3 r3;
}
@Data
@AllArgsConstructor
public static class Tuple4<R1, R2, R3, R4> implements Serializable {
private R1 r1;
private R2 r2;
private R3 r3;
private R4 r4;
}
@Data
@AllArgsConstructor
public static class Tuple5<R1, R2, R3, R4, R5> implements Serializable {
private R1 r1;
private R2 r2;
private R3 r3;
private R4 r4;
private R5 r5;
}
@Data
@AllArgsConstructor
public static class Tuple6<R1, R2, R3, R4, R5, R6> implements Serializable {
private R1 r1;
private R2 r2;
private R3 r3;
private R4 r4;
private R5 r5;
private R6 r6;
}
}
这里我把所有的Tuples都定义在了一起,所以使用的话需要通过Tuples.Tuple2<>()这么去用,如果嫌麻烦也可以每一个Tuple单独定义成一个类,如下包结构