最近写代码的时候发现了一段看不懂的代码,之后查了些资料,才知道是lambd的简写形式,在此记录一下
看不懂的代码
RestClientBuilder.RequestConfigCallback requestConfigCallback = builder -> {
builder.setConnectTimeout(clientProperties.getConnTimeout())
.setSocketTimeout(clientProperties.getSocketTimeout())
.setConnectionRequestTimeout(clientProperties.getConnectionRequestTimeout());
return builder;
};
此段代码中的builder在之前根本没有定义,当时笔者就很奇怪为什么这样写没有被idea检测出错误,查了些资料后才发现builder原来并不是我想的那样是一个没有定义的变量,下面给出还原后的代码
还原后的代码
// 创建RequestConfigCallback对象,并重写customizeRequestConfig方法
RestClientBuilder.RequestConfigCallback requestConfigCallback = new RestClientBuilder.RequestConfigCallback() {
@Override
public RequestConfig.Builder customizeRequestConfig(RequestConfig.Builder builder) {
builder.setConnectTimeout(clientProperties.getConnTimeout())
.setSocketTimeout(clientProperties.getSocketTimeout())
.setConnectionRequestTimeout(clientProperties.getConnectionRequestTimeout());
return builder;
}
};
builder实际上是RequestConfigCallback接口中定义的一个方法的入参变量,lambda语法将其简化后变成了函数式写法,从而让代码变的优雅了很多;
更简化的代码
RestClientBuilder.RequestConfigCallback configCallback = requestConfigBuilder -> requestConfigBuilder
.setConnectTimeout(clientProperties.getConnTimeout())
.setSocketTimeout(clientProperties.getSocketTimeout())
.setConnectionRequestTimeout(clientProperties.getConnectionRequestTimeout());
上面这段代码中{}和return都省略了,但是这样的写法有个前提条件:
- 当前接口的抽象方法中的入参只有一个,并且该方法的返回对象和入参对象相同,如下图: