x::getid和x -> x.getid的区别
时间: 2024-05-14 20:18:38 浏览: 94
x::getid是使用作用域解析运算符来访问类的静态成员函数getid,不需要通过类对象来调用。而x->getid是使用指针成员访问运算符来访问类的非静态成员函数getid,需要通过指针对象来调用。
例如,对于以下代码:
```c++
class MyClass {
public:
static int getid() {
return 1;
}
int num;
};
int main() {
MyClass x;
x.num = 2;
cout << MyClass::getid() << endl; // 输出1
cout << x.getid() << endl; // 编译错误
cout << x.num << endl; // 输出2
cout << x->num << endl; // 编译错误
return 0;
}
```
可以看到,MyClass::getid()可以直接通过类名来访问,而x.getid()和x->num都无法编译通过,因为getid()是静态成员函数,无法通过类对象或指针对象来调用,而num是非指针成员变量,也无法通过指针对象来访问。
相关问题
Collectors.groupingBy(x::getid)和Collectors.groupingBy(x -> x.getid)的区别
`Collectors.groupingBy(x::getid)`和`Collectors.groupingBy(x -> x.getid)`其实是等价的。
`x::getid`是一种方法引用,它表示调用`x`对象的`getid()`方法。而`x -> x.getid`则是一种Lambda表达式,它也表示调用`x`对象的`getid()`方法。
两者的区别在于语法上的差异,使用方法引用可以让代码更加简洁易读。但是需要注意的是,方法引用只能用于调用一个方法,而Lambda表达式可以做更多的事情,比如可以在Lambda表达式中编写多行代码。
优化这段代码: List<BaseDataResponse> baseDataList = businessTypeService.findByItfAppCode("xxx").stream().map(x -> new BaseDataResponese(x.getId(), x.getName())).collect(Collectors.toList()); Short id = 6; BaseDataResponse baseDataResponse = baseDataList.stream().filter(x -> id.equals(x.getValue))).findAny().orElse(null); if (baseDataResponse == null) { BusinessTypeInfo businessType = businessTypeService.getBusinessTypeById(id); baseDataList.add(new BaseDataResponese(x.getId(), x.getName())); } return baseDataList;
可以优化的地方有:
1. 首先,可以将 `businessTypeService.findByItfAppCode("xxx")` 的结果缓存起来,避免每次调用都查询数据库。具体可以使用 Spring Cache 或者自己实现一个简单的缓存。
2. 在使用 `filter` 方法时,可以使用方法引用 `x -> id.equals(x.getValue())` 改为 `id::equals`,简化代码。
3. 在判断 `baseDataResponse` 是否为 null 时,可以使用 `ifPresentOrElse` 方法,代码更简洁。
优化后的代码如下:
```
@Cacheable("baseData")
public List<BaseDataResponse> getBaseDataList() {
List<BaseDataResponse> baseDataList = businessTypeService.findByItfAppCode("xxx")
.stream()
.map(x -> new BaseDataResponse(x.getId(), x.getName()))
.collect(Collectors.toList());
Short id = 6;
baseDataList.stream()
.filter(id::equals)
.findAny()
.ifPresentOrElse(
baseDataResponse -> {},
() -> {
BusinessTypeInfo businessType = businessTypeService.getBusinessTypeById(id);
baseDataList.add(new BaseDataResponse(businessType.getId(), businessType.getName()));
}
);
return baseDataList;
}
```
注意,这里使用了 `ifPresentOrElse` 方法,需要 Java 9 或以上版本的支持。如果使用的是低版本的 Java,可以将其改为传统的 if-else 语句。
阅读全文