将列表转换为可选的映射。

3
我有一个 User 列表,我想将其转换为一个 IdUser 的 Map。但是,该列表可能为空,因此如果我使用 Stream 进行转换,它会抛出异常。
public Map<Long, User> getUserMap() {
  List<User> users = getUserList(); //the method getUserList() can
  // return null and this method can not be further changed

  return users.stream()
              .collect(Collectors.toMap(User::getId, user - > user)));
  //throwing nullPointerException when users is null
}

我打算将空Map的返回类型更改为Optional类型。在下面的代码中,如果我已经使用了Optional类型,那么整个操作是否可以像Stream操作那样链接起来,而不是使用if else null检查。这种做法可行吗?

public Optional<Map<Long, User>> getUserMap() {
  List<User> users = getUserList(); //the method getUserList() can return null
  
  if (users == null) {
    return Optional.empty();
  } else {
    return Optional.of(users.stream()
                   .collect(Collectors.toMap(User::getId, user - > user)));
  }
}


//not working
public Optional<Map<Long, User>> getUserMap() {
      List<User> users = getUserList(); //the method getUserList() can return null

 return Optional.ofNullable(users)
         .stream()
         .collect(Collectors.toMap(User::getId, user -> user));
}

3
你可以尝试使用 Optional.ofNullable(users).map(list -> list.stream().collect(Collectors.toMap(User::getId, user -> user))) (或者是用 Function.identity() 替代 user -> user) 。 - Thomas
1个回答

3
您说:

我有一个用户列表,希望将其转换为Id和User的映射表。但是,该列表可能为空,因此如果我使用Stream进行转换,它会抛出异常。

因此,与其采取Optional路线,不如用一个调用方法解决您最初的问题,该方法返回填充的List或null,而不是空列表。您可以轻松地将接收到的任何null替换为空列表。如果您这样做,您最初的方法将产生您所需的空映射表。

将此更改为:

List<User> users = getUserList(); 

...变成了这样:

List<User> users = Objects.requireNonNullElse( getUserList() , List.of() ) ;  // Now `users` is never null. 

这样可以避免空值到达并破坏你的基于流的代码。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接