以最有效和可读的方式进行条件初始化

时间:2018-10-29 09:16:11

标签: java if-statement initialization java-stream ternary-operator

有条件地初始化Collection(在此示例中为Map)的最有效方法是什么?就最佳做法而言,您是否比其他解决方案更喜欢?

我提供了三种解决方案,我想请您提供反馈或意见。

第一

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<>();

这里的附加约束是,在使用userIdList之前,您需要验证nullempty()的{​​{1}}

2 个答案:

答案 0 :(得分:4)

我将完全删除该条件。如果您串流一个空列表并将其收集到地图上,则会得到一个空地图:

Map<String, User> userMap = 
    userService.getUsers(userIdList)
               .stream()
               .collect(Collectors.toMap(UserDto::getUserName, Function.identity()));

答案 1 :(得分:2)

  

初始化集合的最有效方法是什么?

如果没有Collections.emptyMap(),我将使用userIdList,如下所示。

Map<String, User> userMap;
if (isNotEmpty(userIdList)) {
  userService
      .getUsers(userIdList)
      .stream()
      .collect(Collectors.toMap(UserDto::getUserName, Function.identity()));
} else {
    userMap = Collections.emptyMap();
}

使用Collections.emptyMap()时,意图非常清晰且可读性强。

您可以查看Collection.emptyMap() API here

正如其他人已经提到的那样,Option(1)和Option(3)之间没有区别。


尽管如此,您不会在这件事上看到任何大的性能差异(除非您循环执行此操作)。如果性能是真正的问题,那么只需检查应用程序中是否存在其他真正的瓶颈。