gpt4 book ai didi

java - Guava 根据另一个列表对列表进行排序的方式?

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:28:49 26 4
gpt4 key购买 nike

我有 List<Integer>包含我的用户的 ID。在数据库查询之后,我正在检索 List<User> .我想根据第一个 Id 列表对这个列表进行排序。 List<User>可能不包括某些 ID。排序此列表的 Guava 方法是什么?

最佳答案

使用 Guava 的完全“功能性”方式会将 Ordering#explicit()Ordering#onResultOf() 结合起来

public class UserService {

@Inject private UserDao userDao;

public List<User> getUsersWithIds(List<Integer> userIds) {
List<User> users = userDao.loadUsersWithIds(userIds);
Ordering<User> orderById = Ordering.explicit(userIds).onResultOf(UserFunctions.getId());
return orderById.immutableSortedCopy(users);
}

}

您可以内联声明一个匿名函数,但我喜欢在一个单独的类中将我的函数声明为静态工厂方法,以获得更清晰的代码(Java 函数声明的冗长隐藏在实用程序类中):

/**
* Static factory methods to create {@link Function}s for {@link User}s.
*/
public final class UserFunctions {
private UserFunctions() { /* prevents instantiation */ }

/**
* @return a {@link Function} that returns an {@link User}'s id.
*/
public static Function<User, Integer> getId() {
return GetIdFunction.INSTANCE;
}

// enum singleton pattern
private enum GetIdFunction implements Function<User, Integer> {
INSTANCE;

public Integer apply(User user) {
return user.getId();
}
}

}

正如@Arne 在评论中提到的,这可以在 Java 8 中简化,使用方法引用而不是 UserFunctions 类:

public class UserService {

@Inject private UserDao userDao;

public List<User> getUsersWithIds(List<Integer> userIds) {
List<User> users = userDao.loadUsersWithIds(userIds);
Ordering<User> orderById = Ordering.explicit(userIds).onResultOf(User::getId);
return orderById.immutableSortedCopy(immutableSortedCopy(users));
}

}

关于java - Guava 根据另一个列表对列表进行排序的方式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10930443/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com