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(…)
,以便尽早发现此类错误。如果我们需要一个可变的映射,你必须使用一个收集器来获取映射工厂。