1. 程式人生 > 實用技巧 >java8 lambda表示式實現自定義使用者元件,Don't Repeat Yourself

java8 lambda表示式實現自定義使用者元件,Don't Repeat Yourself

一、使用者元件的功能

使用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/

來源:站長資訊