【问题标题】:How to use Streams instead of do while loop?如何使用 Streams 而不是 while 循环?
【发布时间】:2023-01-13 11:16:08
【问题描述】:

如何避免命令式循环并将 Java 的 Streaming API 用于下面提到的 google 目录 API 的实现?

List<GroupMember> groupMemberList = new ArrayList<>();
Directory.Members.List listRequest = getDirectoryApi().members().list(groupEmailAddress);
Members members;
do {
    members = listRequest.execute();
    members.getMembers().forEach(member -> groupMemberList.add(new
        GroupMember(member.getId(), member.getEmail())));
} while (null != members.getNextPageToken());
return groupMemberList;

【问题讨论】:

  • 流不是分页的好用例
  • 避免命令式循环不是一个明智的目标。目标应该是最大限度地提高可读性……如果您尝试使用 Stream 的 API 将某些任务硬塞到解决方案中,那么某些任务的可读性(或效率)并不高。仅仅因为您买了一把新锤子并不意味着您应该将它用于全部你的木工任务。
  • 也许我错了......但是你的代码不应该使用setNextPageToken()来前进到下一页吗?根据stackoverflow.com/a/31260400/139985
  • @StephenC 你是对的。感谢您指出了这一点。

标签: java java-stream google-directory-api


【解决方案1】:
List<GroupMember> groupMemberList = new ArrayList<>();
Directory.Members.List listRequest = getDirectoryApi().members().list(groupEmailAddress);
String nextPageToken = null;

do {
    listRequest.setPageToken(nextPageToken);
    Members members = listRequest.execute();
    nextPageToken = members.getNextPageToken();
    groupMemberList.addAll(members.getMembers().stream()
        .map(member -> new GroupMember(member.getId(), member.getEmail()))
        .collect(Collectors.toList()));
} while (nextPageToken != null);

return groupMemberList;

这里,可以使用Stream类的map函数将API返回的每个成员转换为GroupMember对象,然后使用collect方法将GroupMember对象添加到列表中。 addAll 方法用于将流中的所有元素添加到 groupMemberList。

此外,您可以使用 while 循环并检查 nextPageToken 变量中的空值,而不是使用 do-while 循环,如果它不为空,则执行循环。

这样代码可读性更强,命令性更小。

【讨论】:

    猜你喜欢
    • 2011-10-06
    • 1970-01-01
    • 2014-01-14
    • 1970-01-01
    • 2020-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多