java8 lambda表示式實現自定義使用者元件,Don't Repeat Yourself
阿新 • • 發佈:2020-08-09
一、使用者元件的功能
使用java8 lambda表示式實現實現世界的一個例子:使用者元件。此使用者元件有以下幾個操作:獲取使用者列表,獲取單個使用者,增加使用者,刪除使用者,更新使用者。所有的操作都是使用UserRequest物件並返回一個UserResponse物件。
在各個操作中,需要在方法執行前進行請求合法性驗證,方法執行後進行特殊的響應處理,檢查所有的響應特性
執行日誌記錄或其他操作。
在原來的處理方式中,需要在每個操作中都把要執行的請求方法包括在至少一個try-catch語句塊中。在java8中,可以建立一個的方法統一處理方法執行前後的操作,如原始碼中的callComponent方法,使程式碼更加簡單,更少的程式碼重複。
二、程式碼樣例
1.定義一個使用者類User
2.定義使用者元件的介面UserComponent,UserRequest,UserResponse
3.使用lambda表示式實現使用者元件的介面UserComponentImpl
4.實現Adapter類UserComponentAdapter
5.建立測試類UserComponentTest
public class User {
Integer id;
String name;
Integer age;
User() {
}
User(int id, String name, int age) {
this.id = id;
this.name=name;
this.age = age;
}
public String toString() {
return "" + id + "-" + name + "-" + age;
}
}
public interface UserComponent {
UserResponse fetchAllUsers(UserRequest req);
UserResponse fetchUser(UserRequest req);
UserResponse deleteUser(UserRequest req);
UserResponse updateUser(UserRequest req);
UserResponse insertUser(UserRequest req);
}
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
public class UserComponentImpl implements UserComponent {
List<User> users = new ArrayList<User>();
public UserResponse fetchAllUsers(UserRequest req) {
return new UserResponse(users);
}
public UserResponse fetchUser(UserRequest req) {
return new UserResponse(users.stream()
.filter(u -> u.id.equals(req.user.id))
.collect(Collectors.toList()));
}
public UserResponse deleteUser(UserRequest req) {
users = users.stream().filter(u -> (!u.id.equals(req.user.id)))
.collect(Collectors.toList());
return new UserResponse(true);
}
public UserResponse updateUser(UserRequest req) {
List<User> list = users.stream().filter(u -> u.id.equals(req.user.id))
.collect(Collectors.toList());
if (list.size() > 0) {
User user = list.get(0);
user.name = req.user.name;
user.age = req.user.age;
return new UserResponse(true);
}
return new UserResponse(false);
}
public UserResponse insertUser(UserRequest req) {
users.add(req.user);
return new UserResponse(true);
}
}
import java.io.IOException;
import java.util.List;
import java.util.function.Function;
public class UserComponentAdapter {
UserComponent uc = new UserComponentImpl();
UserResponse callComponent(UserRequest request,
Function<UserRequest, UserResponse> func) {
try {
// 驗證請求的合法性
UserResponse response = func.apply(request);
// 特殊的響應處理,檢查所有的響應特性
// 執行日誌記錄和/或其他操作
return response;
} catch (Exception e) {
e.printStackTrace();
// 進行異常處理
return new UserResponse(true);
}
}
List<User> fetchAllUsers() throws IOException {
return callComponent(new UserRequest(), uc::fetchAllUsers).users;
}
User fetchUser(Integer id) throws IOException {
return callComponent(new UserRequest(new User(id, "", 0)),
uc::fetchUser).users.get(0);
}
boolean deleteUser(Integer id) throws IOException {
return callComponent(new UserRequest(new User(id, "", 0)),
uc::deleteUser).success;
}
boolean updateUser(User user) throws IOException {
return callComponent(new UserRequest(user), uc::updateUser).success;
}
boolean insertUser(User user) throws IOException {
return callComponent(new UserRequest(user), uc::insertUser).success;
}
}
import java.io.IOException;
public class UserComponentTest {
public static void main(String[] args) throws IOException {
UserComponentAdapter uca = new UserComponentAdapter();
uca.insertUser(new User(1, "張三", 12));
uca.insertUser(new User(2, "李四", 21));
uca.insertUser(new User(3, "王五", 32));
uca.insertUser(new User(4, "趙六", 43));
System.out.println(uca.fetchAllUsers());
System.out.println(uca.fetchUser(2));
System.out.println(uca.updateUser(new User(3, "王五五", 55)));
System.out.println(uca.deleteUser(4));
System.out.println(uca.fetchAllUsers());
}
}
public class UserRequest {
User user;
public UserRequest() {
}
public UserRequest(User user) {
this.user = user;
}
}
import java.util.List;
public class UserResponse {
List<User> users;
boolean success = true;
public UserResponse(boolean success) {
this.success=success;
}
public UserResponse(List<User> users) {
this.users = users;
}
}
三、參考資料
http://docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html.
http://www.dreamsyssoft.com/java-8-lambda-tutorial/
來源:站長資訊