数据库有一些数据,如下模拟;
ArrayList<User> objects = Lists.newArrayList();
objects.add(new User("zhangsan", "123456", 18, 1));
objects.add(new User("lisi", "123456", 22, 1));
objects.add(new User("wangwu", "123456", 30, 1));
objects.add(new User("zhaoliu", "123456", 43, 1));
objects.add(new User("xiaoli", "xiaoli67889", 16, 0));
objects.add(new User("xiaona", "nai324389", 22, 0));
针对这些数据的查询而言,通常会在 service 层定义许多查询接口,例如
面对需求的变化多样,总是需要增量添加 controller 方法,service 方法,甚至 dao 方法,如何解决这个问题呢?
//dao
public static List<User> getUserList() {
ArrayList<User> objects = Lists.newArrayList();
objects.add(new User("zhangsan", "123456", 18, 1));
objects.add(new User("lisi", "123456", 22, 1));
objects.add(new User("wangwu", "123456", 30, 1));
objects.add(new User("zhaoliu", "123456", 43, 1));
objects.add(new User("xiaoli", "xiaoli67889", 16, 0));
objects.add(new User("xiaona", "nai324389", 22, 0));
return objects;
}
//service
public static Optional getUserListByPredicate(Predicate<User> predicate) {
List<User> userList = UserDao.getUserList();
ArrayList<Object> resultList = Lists.newArrayList();
for (User user : userList) {
if (predicate.test(user)) {
resultList.add(user);
}
}
return Optional.ofNullable(resultList);
}
//controller
public static void main(String[] args) {
//查询性别为男,年龄 20 以下,并且密码为默认密码 123456 的用户
Optional<List> result = UserService.getUserListByPredicate((User user) -> {
return user.getSex() == 1 && user.getAge() < 20 && user.getPassword().equals("123456");
});
result.get().stream().forEach(user -> System.out.println(user));
}
我的想法是,dao 层总是返回全量的数据(此处有问题性能问题),在 service 层对查询条件进行抽象,controller 只需要将查询条件传入即可。
//dao
public static List<User> getUserList() {
ArrayList<User> objects = Lists.newArrayList();
objects.add(new User("zhangsan", "123456", 18, 1));
objects.add(new User("lisi", "123456", 22, 1));
objects.add(new User("wangwu", "123456", 30, 1));
objects.add(new User("zhaoliu", "123456", 43, 1));
objects.add(new User("xiaoli", "xiaoli67889", 16, 0));
objects.add(new User("xiaona", "nai324389", 22, 0));
return objects;
}
//controller 层
/**
* 查询性别为男,年龄 20 以下,并且密码为默认密码 123456 的用户
*
* @param args
*/
public static void main(String[] args) {
List<User> userList = UserDao.getUserList();
userList.stream().filter(
user -> user.getSex() == 1 && user.getAge() < 20 && user.getPassword().equals("123456")
).forEach(user -> System.out.println(user));
}
我的想法是,controller 总是获取所有的数据,针对流根据业务进行业务操作。
——————————
以上两种方法是否可行? 问题?
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.