使用番石榴的完全“功能性”方式将
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的函数声明的详细信息隐藏在实用程序类中):
public final class UserFunctions { private UserFunctions() { } 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)); }}


