Java 以最有效和可读的方式进行条件初始化
有条件地初始化集合(在本例中为映射)的最有效方法是什么?就最佳实践而言,您是否更喜欢一种解决方案 我提供了三种解决方案,我想征求您的反馈或意见 第一名:Java 以最有效和可读的方式进行条件初始化,java,if-statement,initialization,java-stream,ternary-operator,Java,If Statement,Initialization,Java Stream,Ternary Operator,有条件地初始化集合(在本例中为映射)的最有效方法是什么?就最佳实践而言,您是否更喜欢一种解决方案 我提供了三种解决方案,我想征求您的反馈或意见 第一名: Map<String, User> userMap; if (isNotEmpty(userIdList)) { userService .getUsers(userIdList) .stream() .collect(Collectors.toMap(UserDto::getUserName
Map<String, User> userMap;
if (isNotEmpty(userIdList)) {
userService
.getUsers(userIdList)
.stream()
.collect(Collectors.toMap(UserDto::getUserName, Function.identity()));
} else {
userMap = new HashMap<>();
}
Map<String, User> userMap = new HashMap<>();
if (isNotEmpty(userIdList)) {
userService
.getUsers(userIdList)
.stream()
.collect(Collectors.toMap(UserDto::getUserName, Function.identity()));
}
Map<String, User> userMap = isNotEmpty(userIdList) ?
userService
.getUsers(userIdList)
.stream()
.collect(Collectors.toMap(UserDto::getUserName, Function.identity()))
: new HashMap<>();
Map用户映射;
if(isNotEmpty(userIdList)){
用户服务
.getUsers(userIdList)
.stream()
.collect(Collectors.toMap(UserDto::getUserName,Function.identity());
}否则{
userMap=newhashmap();
}
秒:
Map<String, User> userMap;
if (isNotEmpty(userIdList)) {
userService
.getUsers(userIdList)
.stream()
.collect(Collectors.toMap(UserDto::getUserName, Function.identity()));
} else {
userMap = new HashMap<>();
}
Map<String, User> userMap = new HashMap<>();
if (isNotEmpty(userIdList)) {
userService
.getUsers(userIdList)
.stream()
.collect(Collectors.toMap(UserDto::getUserName, Function.identity()));
}
Map<String, User> userMap = isNotEmpty(userIdList) ?
userService
.getUsers(userIdList)
.stream()
.collect(Collectors.toMap(UserDto::getUserName, Function.identity()))
: new HashMap<>();
Map userMap=newhashmap();
if(isNotEmpty(userIdList)){
用户服务
.getUsers(userIdList)
.stream()
.collect(Collectors.toMap(UserDto::getUserName,Function.identity());
}
第三名:
Map<String, User> userMap;
if (isNotEmpty(userIdList)) {
userService
.getUsers(userIdList)
.stream()
.collect(Collectors.toMap(UserDto::getUserName, Function.identity()));
} else {
userMap = new HashMap<>();
}
Map<String, User> userMap = new HashMap<>();
if (isNotEmpty(userIdList)) {
userService
.getUsers(userIdList)
.stream()
.collect(Collectors.toMap(UserDto::getUserName, Function.identity()));
}
Map<String, User> userMap = isNotEmpty(userIdList) ?
userService
.getUsers(userIdList)
.stream()
.collect(Collectors.toMap(UserDto::getUserName, Function.identity()))
: new HashMap<>();
Map userMap=isNotEmpty(userIdList)?
用户服务
.getUsers(userIdList)
.stream()
.collect(Collectors.toMap(UserDto::getUserName,Function.identity())
:newhashmap();
这里的附加约束是,在使用
userService.getUsers()
之前,您需要验证userIdList
是否为null
和empty()
。如果流式传输空列表并将其收集到地图,则会得到一个空地图:
Map<String, User> userMap =
userService.getUsers(userIdList)
.stream()
.collect(Collectors.toMap(UserDto::getUserName, Function.identity()));
Map用户映射=
getUsers(userIdList)
.stream()
.collect(Collectors.toMap(UserDto::getUserName,Function.identity());
初始化集合的最有效方法是什么
如果没有userIdList
,我将使用如下所示的Collections.emptyMap()
Map<String, User> userMap;
if (isNotEmpty(userIdList)) {
userService
.getUsers(userIdList)
.stream()
.collect(Collectors.toMap(UserDto::getUserName, Function.identity()));
} else {
userMap = Collections.emptyMap();
}
Map用户映射;
if(isNotEmpty(userIdList)){
用户服务
.getUsers(userIdList)
.stream()
.collect(Collectors.toMap(UserDto::getUserName,Function.identity());
}否则{
userMap=Collections.emptyMap();
}
当您使用Collections.emptyMap()
时,它使意图非常清晰,可读性更强
您可以查看Collection.emptyMap()
API
正如其他人已经提到的,选项(1)和选项(3)之间没有区别
尽管如此,您不会看到这一点在性能上有任何大的差异(除非您在循环中这样做)。如果性能是真正的问题,那么只需检查应用程序内部是否存在真正的瓶颈。第一种和第三种方法基本相同。第二种方法效率很低,但破坏了有效的最终性。
userMap=userService…
。我最喜欢的是第三种解决方案。这里唯一的问题是空列表情况下的调用成本。假设在使用userService.getUsers()
@zycoo之前,您需要验证userIdList
是否为null
和empty()
返回一个不可变的映射。根据代码中的进一步操作,这可能会导致错误。如果是不变性,这将是最好的。另外。Collections.emptyMap()
是否更有效,因为它不会创建新对象(代价高昂),也不会保留更多的内存空间?@mtj这是一件好事,因为Collectors.toMap(…)
也不能保证返回可变映射。它确实返回了一个可变的HashMap
,这是一个根据未指定的实现细节创建代码的邀请。处理此问题的最佳方法是对空案例使用Collections.emptyMap()
,并将结果包装到另一个案例中的Collection.unmodifiableMap(…)
,以便尽早发现此类错误。如果我们需要一个可变的映射,你必须使用一个收集器来获取映射工厂。