重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
这篇文章主要介绍“怎么使用Try”,在日常操作中,相信很多人在怎么使用Try问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么使用Try”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!
成都创新互联-专业网站定制、快速模板网站建设、高性价比田阳网站开发、企业建站全套包干低至880元,成熟完善的模板库,直接使用。一站式田阳网站制作公司更省心,省钱,快速模板网站建设找我们,业务覆盖田阳地区。费用合理售后完善,十多年实体公司更值得信赖。
Java的Optional非常好用。我们一般使用Optional做非空处理,省去if的处理。主要的目的,就是为了解决Java中臭名昭著的空指针异常。
比如我们在平常的编码中,经常遇到对输入参数的非空判断。
public void getXXX(Mapparams) { Map map = params; if (map == params) { map = new HashMap<>(); } }
这种代码一多,我们的程序就会慢慢变成shit mountain。这个时候就可以使用Optional进行改造。
public void getXXX(Mapparams) { Map map = Optional.ofNullable(params).orElse(new HashMap<>()); }
代码行数少了,逻辑清晰,同时自己的绩效也降低了 :)。
1. 复杂例子
看一个比较复杂的例子。
假如我们需要的数据层次比较深。
String cityCode = customer.getAddress().getCity().getCityCode().substring(0,3);
这样获取是不合理的,因为其中的某一环,可能是空,会抛出空指针的。所以,我们需要一层层的进行判断。
public void getCityCode(Customer customer) { String cityCode = "000"; if (customer != null) { Address address = customer.getAddress(); if (null != address) { City city = address.getCity(); if (city != null) { String code = city.getCityCode(); if (null != code && code.length() >= 3) { cityCode = code.substring(0, 3); } } } } System.out.println(cityCode); }
使用Optional的lambda语法,我们可以把代码改成下面这样:
public void getCityCode(Customer customer) { String cityCode = Optional.ofNullable(customer) .map(c -> c.getAddress()) .map(a -> a.getCity()) .map(c -> c.getCityCode()) .filter(s -> s.length() >= 3) .map(s -> s.substring(0, 3)) .orElse("000"); }
代码是不是颜值很高?
颜值虽高,下面还是要点一些偏门的重点内容。
2. Optional的隐秘内容
其实,早在Java8发布之前(2014),guava就有了类似的工具,但由于当时并没有lambda语法,所以只能做些简单的应用。
Guava的optional支持序列化,可以在RPC框架方法中返回,但是一般很少用。
Java的Optional却根本无法序列化。为什么java8的Optional没有实现序列化,这里有个讨论,可以看看http://mail.openjdk.java.net/pipermail/jdk8-dev/2013-September/003186.html
另外Java8比Guava多了ifPresent、map、 filter、 flatMap、 orElseThrow这些方法。鉴于现在使用Guava Optional的人越来越少,不提也罢。
Optional会对GC有一定压力,如果开发底层框架,还是慎重使用,netty就曾经过测试,最后放弃了Optional。
但我还是喜欢用。谁让国内大多数都是cruder呢?
3. Try为何物?
长期使用使用Java编码的Javaer,在见了Scala、Kotlin一类的语言后,会有一种惊艳的感觉。但这些包实在是太大了,引入有一定的成本,只能眼巴巴的馋她们的身子。
但是,Java 标准库对函数式编程的 API 支持相对比较有限。有没有一种轻量级的方式,来增强我们的Java库呢?要是能和Lambda表达式结合起来,那就更妙了。Vavr就是这样一个简单的Jar包,让我们的代码,写起来更加流畅。
它的maven坐标是:
io.vavr vavr 0.10.3
下面是一段伟大的睡眠排序法的代码:
public class SleepSort implements Runnable { private int num; public SleepSort(int num) { this.num = num; } @Override public void run() { try { Thread.sleep(num * 10); } catch (Exception e) { e.printStackTrace(); } System.out.print(num + " "); } public static void main(String[] args) { int[] nums = {5, 22, 10, 7, 59, 3, 16, 4, 11, 8, 14, 24, 27, 25, 26, 28, 23, 99}; Arrays.stream(nums).forEach(n->new Thread(new SleepSort(n)).start()); } }
其中的Run部分,太多无用的信息,我们可以使用Try来改造。
我们可以简化为下面两行:
Try.run(()->Thread.sleep(num*10)) .andThen(()->System.out.print(num + " "));
它支持非常多的方法,可以完成大多数后续的业务处理。比如,在onFailure方法里,加入对异常信息的日志记录。
而常见的jackson json的处理,可以简化成下面的代码:
String json = Try.of(() -> objectMapper.writeValueAsString(str)).getOrElse("{}");
Try就是这么好用。最重要的是,vavr的大小只有800多kb。
4. vavr的更多操作
vavr支持Tuple(元组)、Option、Try、Either、集合便捷操作、多元函数、柯里化方法(curring)等。
可以看一下vavr版本的if else。下面是四个分支的代码。里面这些奇怪的符号,证明它也只是语法糖。
public String vavrMatch(String input) { return Match(input).of( Case($("a"), "a1"), Case($("b"), "b2"), Case($("c"), "c3"), Case($(), "unknown") ); }
再比如,你想要定义一个函数,而不是一个类,在Java中可以使用Function。但可惜的是,Java的Function只支持一个参数。
使用Vavr的Function,最多支持22个参数!
再比如,你想要在一个方法中,返回多个值。这个,在python中很容易实现,在Java中就不得不定义一个Class去接收。
元组,就可以支持多个返回值的组合。比如下面的代码:
// (Java, 8) Tuple2java8 = Tuple.of("Java", 8); // "Java" String s = java8._1; // 8 Integer i = java8._2;
vavr支持一次性返回8个值。
另外,还有lazy等小工具。比如延迟获取值。
Lazylazy = Lazy.of(Math::random); lazy.isEvaluated(); // = false lazy.get(); // = 0.123 (random generated) lazy.isEvaluated(); // = true lazy.get(); // = 0.123 (memoized)
这样的扩展方法有很多。但我最常用的,还是Try和元组。它让代码变的更加优雅,表达意图也更加清晰。
哦对了。resilience4j就重度使用了vavr,就是那个Hystrix不再更新之后,官方推荐的那个熔断组件。
到此,关于“怎么使用Try”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注创新互联网站,小编会继续努力为大家带来更多实用的文章!