Optional的私人使用技巧(一)

1、爬虫时遇到html页面

演示时我截取有这么一段表单(该页面只有一个表单),当然我已经把关键字段给xxx了
需要获取表单的所有input域的name和value,并返回一个Map<String,Object>

<body>
   <form style="margin: 0px; padding: 0px;" method="post" 
         action="XXX" id="pform" name="pform"> 
       <input type="hidden" name="part1" value="1"/> 
       <input type="hidden" name="part2" value="2"/> 
       <input type="hidden" name="part3" value="3"/> 
       <input type="hidden" name="part4" value="null"/> 
       <input type="hidden" name="part5" value="null"/> 
       <input type="hidden" name="part6" value="1"/> 
       <input type="hidden" name="part7" value="2"/> 
       <input type="hidden" name="part8" value=""/> 
       <input type="hidden" name="part9" value="null"/> 
       <input type="hidden" name="part10" value=""/> 
   </form>
</body>

2、开始动手,使用Jsoup解析

直接上代码,这个就是一堆doc操作而已,是吧,,不难。

public static Map<String, Object> formFirst(Document document) {
	Map<String, Object> params = new HashMap<>();
	//当然也可以根据id
	FormElement formElement = document.body().children().forms().get(0);
	formElement.formData().forEach(e->params.put(e.key(),e.value()));
	return params;
}

问题在哪呢?如果某一天这个页面真的被后台改造了,那么这段代码就会出问题,抛出NPE。

3、使用Optional<>

	public static Map<String, Object> formFirst(Document document) {
        Map<String, Object> params = new HashMap<>();
        Optional.ofNullable(document.body())
                //.flatMap(e -> Optional.ofNullable(e.children())) //flatMap要求传入non null
                //.flatMap(e -> Optional.ofNullable(e.forms()))
                .map(Element::children)
                .map(Elements::forms)
                .filter(e -> e.size() > 0)
                .map(e -> e.get(0))
                .ifPresent(e -> e.formData().forEach(e2 -> params.put(e2.key(), e2.value())));
        if (params.isEmpty()) {
            logger.warn("can't get params corrently of the giving html");
        }
        return params;
    }

简单易用,可以自己尝试下。
Optional非常适合在解析某些格式的文件或者对象,比如xml,html亦或是http交互的对象,因为不确定是否拥有我想要的域,所有不断抽丝剥茧拿到想要的。

发布了22 篇原创文章 · 获赞 0 · 访问量 7686

猜你喜欢

转载自blog.csdn.net/sawiii/article/details/103934494