另外提一点,上面的复制变量再操作的方式让我想到了CopyOnWriteArrayList,这也是让当前变量不被其他线程改变保证当前线程变量一致性的一种方式 。
写 JDK 源码的都是大神啊,透过源码,我们能学到太多东西!
5、泛型来看一段泛型的灵活运用:
public <R> Observable<R> compose(Transformer<? super T, ? extends R> transformer) { return ((Transformer<T, R>) transformer).call(this);}
这个泛型方法写得牛 X 吧,泛型 T、R、通配符(?)、上边界(extends)和下边界(super)都用上了!
常用的泛型含义:
- T - Type(类型)
- R - Result(结果)
- K - Key(键)
- V - Value(值)
- E - Element (元素)
- N - Number(数字)
- ? - 不确定类型
泛型要学会用,学好能装B 。
6、LambdaLambda 表达式这是 Java 8 里面添加的新特性,用来简化匿名内部类以及结合函数式接口编程用的 。
如下面创建线程的示例:
// 1Runnable runnable = () -> System.out.println("javastack.cn");new Thread(runnable).start();// 2new Thread(() -> System.out.println("javastack.cn")).start();// 3new Thread(() -> clean()).start();
三个不同的写法,我们再也不用写new Runnable()的一大堆 的匿名内部类了,是不是很清爽了!如果你还不会用Lambda表达式,那真的 OUT 了,可以关注微信公众号:Java技术栈,在后台回复:新特性,我已经写了一大堆教程了 。
下面是一个Lambada真实案例:
@Beanpublic CommandLineRunner commandLineRunner(NettyServer nettyServer) { return (args) -> { Thread thread = new Thread(() -> nettyServer.start()); thread.setDaemon(true); thread.start(); };}
【Java 10 大装 B 写法,看完可以出去吹了!】上述示例省去了 newCommandLineRunner的匿名内部类的过程 。7、函数式编程上面有提到函数式编程,这是 Java 8 里面添加的新特性,我之前在公众号里已经写过很多 Java 新特性的教程,这也不是新玩法了,已经被玩烂了 。
来看一个真实的案例,来自 Spring Boot 的邮件发送自动配置:
private void ApplyProperties(JavaMailSenderImpl sender) { PropertyMapper map = PropertyMapper.get(); map.from(this.properties::getHost).to(sender::setHost); map.from(this.properties::getPort).whenNonNull().to(sender::setPort); map.from(this.properties::getUsername).to(sender::setUsername); map.from(this.properties::getPassword).to(sender::setPassword); map.from(this.properties::getProtocol).to(sender::setProtocol); map.from(this.properties::getDefaultEncoding).whenNonNull().as(Charset::name) .to(sender::setDefaultEncoding); map.from(this.properties::getProperties).whenNot(Map::isEmpty) .as(this::asProperties).to(sender::setJavaMailProperties);}
第一次看到这段代码的时候,我内心是拒绝的,很难理解 。上面的 from 和 to 方法分别用到了Supplier和Consumer函数式接口,还用到了双冒号::结合使用,讳莫如深,还能结合Lambda表达式使用 。
函数式编程很厉害,虽然会用,但到现在我也觉得很高深,可读性和可理解性太差了,但是,装 X 必学、必用 。
8、流关闭
MyInputStream mis = new MyInputStream();MyOutputStream mos = new MyOutputStream();try (mis; mos) { mis.read("1.9"); mos.write("1.9");} catch (Exception e) { e.printStackTrace();}
没错,你看到的这个关闭流骚操作是 Java 9 的新语法糖,较 Java 7 又简化了try-with-resources用法,装 X 的姿势越来越多了 。关于try-with-resources的详细介绍及演进过程,大家可以阅读这篇文章:JDK9新特性实战:简化流关闭新姿势,或者可以关注微信公众号:Java技术栈,在后台回复 "新特性" 获取这篇文章完整版 。
推荐阅读
- 简单解释7个主要JavaScript概念
- JavaScript之call和apply的模拟实现
- Spring Boot 一个接口同时支持 form 表单、form-data、json 优雅写法
- 不借助 Javascript,利用 SVG 快速构建马赛克效果
- JavaScript高手进阶:安全键盘
- JavaScript Blob 对象解析
- 16个超级实用的Java工具包
- Java 到底是值传递还是引用传递?
- 是否应该停止在JavaScript代码中使用forEach?
- Java中异常处理的10个最佳实践