Optional<T>的私人使用技巧(一)

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交互的对象,因为不确定是否拥有我想要的域,所有不断抽丝剥茧拿到想要的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值