如何使用Streams替换具有服务调用的循环(Java 8)

时间:2018-01-29 10:55:47

标签: java java-8 java-stream

如何将以下内容转换为循环代码(请注意,crowdClient是对第三方服务的服务调用):

private List<User> getFullUserDetails(CrowdClient crowdClient, List<User> unModifiableUserList) {
    List<User> userList = new ArrayList<User>();
    for (User u : unModifiableUserList) {
        userList.add(crowdClient.getUserWithAttributes(u.getName()));
    }
    return userList;
}

使用Java 8功能(如流)来编写更简单优雅的代码。 我期待下面的东西(顺便说一句,这不起作用):

private List<User> getUserDetails(CrowdClient crowdClient,
        List<User> unModifiableUserList) {
    return unModifiableUserList.stream()
            .filter(unModifiableUserList -> crowdClient.getUserWithAttributes(unModifiableUserList.getName()))
            .collect(Collectors.toList());
}

2 个答案:

答案 0 :(得分:2)

该过滤器应该是地图......

unModifiableUserList.stream()
       .map(u -> crowdClient.getUserWithAttributes(u.getName()))
       .collect(Collectors.toList())

答案 1 :(得分:2)

您正在尝试使用filter来过滤现有列表。另一方面,map将帮助您将现有列表转换为所需的格式。

private List<User> getUserDetails(CrowdClient crowdClient, List<User> unModifiableUserList) {
        return unModifiableUserList.stream()
                .map(user -> crowdClient.getUserWithAttributes(user.getName()))
                .collect(Collectors.toList());
    }