Java将方法作为参数传递

最近在用Java写一套自研爬虫框架,该框架可以通过简单的配置就可以实现目标网站的抓取,不再需要研发人员做开发,业务人员也能抓目标网站哦,有兴趣可以私聊。

为了抽象化需要将用户自定义方法传递给框架,供框架回调。
研究了下发现1.8版新特效lambda表达式配合java.util.function.Function<T, R>可以实现。
java.util.function.Function<T, R>中的T、R,需要结合这个interface的方法R apply(T t)来看, T是输入参数类型,R是返回参数类型。

实例分析

流程:将自定义方法传递到Request对象,当request对象获取response后,回调自定义方法。

实例分析:

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>调用时的写法response -> selfFunction(response);

Ok~

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容