数据库有一些数据,如下模拟;
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 层定义许多查询接口,例如
- 查询性别为男的用户
- 查询性别为男年龄 20 以下的用户
- 查询性别为男年龄 20 以下的并且默认密码是 123456 的用户
- 随需求增加...
面对需求的变化多样,总是需要增量添加 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 只需要将查询条件传入即可。
更进一步用 stream 处理
//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 总是获取所有的数据,针对流根据业务进行业务操作。
——————————
以上两种方法是否可行? 问题?