最近在用Java寫一套自研爬蟲框架舟铜,該框架可以通過簡單的配置就可以實現(xiàn)目標(biāo)網(wǎng)站的抓取贵扰,不再需要研發(fā)人員做開發(fā)仇穗,業(yè)務(wù)人員也能抓目標(biāo)網(wǎng)站哦,有興趣可以私聊戚绕。
為了抽象化需要將用戶自定義方法傳遞給框架纹坐,供框架回調(diào)。
研究了下發(fā)現(xiàn)1.8版新特效lambda表達(dá)式配合java.util.function.Function<T, R>可以實現(xiàn)舞丛。
java.util.function.Function<T, R>中的T耘子、R果漾,需要結(jié)合這個interface的方法R apply(T t)來看, T是輸入?yún)?shù)類型谷誓,R是返回參數(shù)類型绒障。
流程:將自定義方法傳遞到Request對象,當(dāng)request對象獲取response后捍歪,回調(diào)自定義方法户辱。
實例分析:
import java.util.function.Function;
public class Cb {
public static class Response {
private String html;
public Response(String html) { this.html = html; }
public String getHtml() { return html; }
}
public static class Request {
private Function<Response, Object> callback;
public Request(Function<Response, Object> callback) { this.callback = callback; }
public Function<Response, Object> getCallback() { return callback; }
}
public static class Engine {
private Request request;
public void setRequest(Request request) { this.request = request; }
public void run() {
Object o = request.getCallback().apply(new Response("I like moving, moving"));
System.out.println(o);
}
}
public static void main(String[] args) {
Engine engine = new Engine();
engine.setRequest(new Request(response -> returnHtml(response))); engine.run();
engine.setRequest(new Request(response -> returnHtmlb(response))); engine.run();
engine.setRequest(new Request(response -> returnHtmlc(response))); engine.run();
}
public static Object returnHtml(Response response) { return response.getHtml(); }
public static Object returnHtmlb(Response response) { return response.getHtml() + " bb"; }
public static Object returnHtmlc(Response response) { return response.getHtml() + " ccc"; }
}
Lambda搭配Function<T, R>調(diào)用時的寫法response -> selfFunction(response);
Ok~