想不想学习装 B 式的 Java 骚操作花式写法?

没错,本文栈长来教你!

1、集合初始化

集合的创建、赋值一步到位,想不想学?

来,上边跟我一起画个 List,在你下边画一个Map……

List<String> list = new ArrayList<String>() {{    add("www.");    add("javastack.");    add("cn");}};Map<String, String> map = new HashMap<String, String>() {{    put("1", "www.");    put("2", "javastack.");    put("3", "cn");}};

哈哈,高大上的写法,栈长以前写过,写法虽然是很装X,然而并没有什么卵用。

2、算术

static {    final int size = -(-128) + 127 + 1;    // Load and use the archived cache if it exists    VM.initializeFromArchive(ByteCache.class);    if (archivedCache == null || archivedCache.length != size) {        Byte[] c = new Byte[size];        byte value = (byte)-128;        for(int i = 0; i < size; i++) {            c[i] = new Byte(value++);        }        archivedCache = c;    }    cache = archivedCache;}

注意到上面size的写法没有?

明明可以写成:

final int size = 256;

他非要写成:

final int size = -(-128) + 127 + 1;

这么装 B 的写法来自 JDK 包装类java.lang.Byte里面的静态方法。

为什么要这么写呢?

这样的写法在 JDK 里面有很多,大家看到这些写法都会觉得很奇怪,Java技术栈微信群里、知识星球里面有曾有粉丝问我这是为什么。

真正缘由无从考察,但栈长我觉得写 JDK 的大神其实就想告诉你,Byte 的 256 个数是由 -128 ~ 127 这个范围组成的,起到一个标识数字范围的作用而已。

如果你知道其中的更多道道,欢迎留言分享!

3、移位

/** * The default initial capacity - MUST be a power of two. */static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16/** * The maximum capacity, used if a higher value is implicitly specified * by either of the constructors with arguments. * MUST be a power of two <= 1<<30. */static final int MAXIMUM_CAPACITY = 1 << 30;

这两个变量来自java.util.HashMap源码,你可能也非常好奇为什么不直接写成数字,要弄一个移位骚操作?

这是在告诉开发者,HashMap 的容量大小必须是 2 的幂次,不然会造成空间浪费。

以上同样来自java.util.HashMap的源码,为什么不直接用values

transient Collection<V> values;public Collection<V> values() {    if (values == null) {        values = new Values();    }    return values;}

而要重新定义一个vs来绕一个弯呢?

这样写不是更简单么?

JDK里面大量这样的写法,这是为什么呢?!

那是因为操作局部变量要比读取全局变量要更快,另外,我个人觉得还有一个好处,再申明一下局部变量,可以很明显的看到这个变量的类型,而不要翻到上面或者用鼠标移上去来看变量类型。

另外提一点,上面的复制变量再操作的方式让我想到了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、Lambda

Lambda 表达式这是 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();    };}

上述示例省去了 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 方法分别用到了SupplierConsumer函数式接口,还用到了双冒号::结合使用,讳莫如深,还能结合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 的姿势越来越多了。

9、类型推断

关注Java技术栈公众号的老读者应该都看过,Java 10 刚出来的时候,我写过两篇新特性文章:

  • Java 10的10个新特性,将彻底改变你写代码的方式!
  • Java 10 实战第 1 篇:局部变量类型推断

来,我再挑两个示例来欣赏下:

示例1:

var javastack = "javastack";

示例2:

private static void testLoop() {    for (var i = 0; i < 3; i++) {        for (var m = 10; m < 15; m++) {            System.out.println(i + m);        }    }}

这样写会不会被打?也太省事了!

类型推断出来后,都说 Java 越来越像 Javascript 了,其实就是 Java 10 增加的一种语法糖而已,在编译期间会自动推断实际类型,其编译后的字节码和实际类型一致。

10、模式匹配

instanceof模式是匹配这是 Java 14 推出来的新特性:

if (object instanceof Kid kid) {    // ...} else if (object instanceof Kiddle kiddle) {    // ...}

匹配后直接创建对象和赋值直接拿来用,不需要再添加强制转换的代码,大大提高了可读性和安全性。

更多学习内容请阅读我的知乎专栏:打造全网Java高级工程师资料库(总目录)看完学的更加快,知识更牢固。你值得拥有(持续更新)~

Java 10 大装 B 写法,装逼常用代码相关推荐

  1. JAVA十大B格写法!再也不怕没有小姐姐了!

    1.集合初始化 集合的创建.赋值一步到位,想不想学? 来,上边跟我一起画个 List,在你下边画一个Map-- List list = new ArrayList() {{ add("www ...

  2. java 10大常见异常

    1.   java.lang.NullPointerException 这个异常大家肯定都经常遇到,异常的解释是 "程序遇上了空指针 ",简单地说就是调用了未经初始化的对象或者是不 ...

  3. 优秀的java代码_像这样写,Java菜鸟也能写出牛逼的代码

    场景一 有时候我们会遇到一个方法就是占满了整个屏幕,其中各种if else 判断 ,for 循环嵌套,时不时来穿插着各种a b c参数,让人看得实在是眼花缭乱.让后面维护的人望而却步,也实在的代码块后 ...

  4. Java编程10大低级错误

    今天面试时HR问我一个关于数据库性能调优的问题,对于我的回答引发了她的另一个问题:Java 10大低级错误 知不知道?这个在以前公司的时候还真的提过这个问题,但是我实在是...在网上搜了一下,拿来分享 ...

  5. Java 中 10 大坑爹功能!

    今天我们就来聊一下 Java 中的 10 大坑爹功能,它们分别是: 1.switch必须加上break才结束 2.逻辑运算符的"短路"现象 3.数组下标从零开始 4.ArrayLi ...

  6. 2023年最值得下载的Macbook电脑必备实用10款软件推荐,装了绝不后悔!

    Hello!大家好,作为一名Mac电脑6年的老用户,最近刚刚更换了一台新的Mac电脑,之前使用的是MacBook Pro2015款,由于电池老化,换成了MacBook Air2020款,使用感觉还是非 ...

  7. 2020年Java程序员不得不学习的10大技术

    对于Java开发人员来说,最近几年的时间中,Java生态诞生了很多东西.每6个月更新一次Java版本,以及发布很多流行的框架,如Spring 5.Spring Security 5和Spring Bo ...

  8. Java性能优化最易操作的10大技巧!

    编辑 | ShirleyZ 译文 | 班纳睿 .一叶障目  .learner 原文 | https://coyee.com/article/11753-top-10-easy-performance- ...

  9. Java字符串的10大热点问题盘点

    Java字符串的10大热点问题盘点 下面我为大家总结了10条Java开发者经常会提的关于Java字符串的问题,如果你也是Java初学者,仔细看看吧: 1.如何比较字符串,应该用"==&quo ...

  10. Java开发2018年值得学习的10大技术

    转载自 Java开发2018年值得学习的10大技术 作为一个开发人员,我们最大的挑战就是保持自己了解新的技术.技术变化很快,你大概每两年就会看到一个新版本的编程语言和框架. 就拿2017年来说,AR. ...

最新文章

  1. sklearn朴素贝叶斯分类器_朴素贝叶斯原理
  2. plsql怎么查看存储过程中long变量的值_面试官:详细说下基本数据类型与装箱拆箱的过程...
  3. 20175333曹雅坤实验四《Android程序设计》实验报告
  4. docker依赖的Linux内核特性及各命令参数说明
  5. 8.Java web—JSP基本语法
  6. 三线表的制作(硕士毕业论文WORD中)
  7. vue搭配three.js创建3D旋转方块
  8. Rayson API 框架分析系列之6: 客户端动态代理原理
  9. 系统调用ptrace和进程跟踪
  10. 如何理解「朝闻道,夕死可矣」?
  11. 微信查券机器人、微信公众号自动查询淘宝优惠券机器人制作教程
  12. 未来十年,流程管理发展的趋势和挑战
  13. Java每日一练(1)
  14. 数据加密——列置换加密
  15. 面板数据分析及stata应用笔记
  16. 删除Windows启动管理器下的加载项
  17. 荣耀电脑怎样更改计算机名称,王者荣耀荣耀战区怎么修改别的地区?手机电脑改荣耀战区不封号操作方法[多图]...
  18. Microsoft Teams中的访客(三)--访客的管控
  19. 国外有哪些比较好的电子技术方面的网站论坛推荐? - 知乎
  20. Java处理PFX格式证书

热门文章

  1. 计算机窗口的基本组成部分组成部分,windows7窗口的主要组成部分有哪些
  2. 宝塔面板php无法安装,宝塔面板php无法安装怎么办
  3. 阿里云域名备案与服务器tomcat非80端口绑定
  4. java 200以内的素数_Java——200以内的质数
  5. 非科班程序员AI学习路径建议
  6. 冯 • 诺依曼体系结构
  7. atxserver2接入iOS设备
  8. 什么是长连接 | 短连接?
  9. 网络域名之一级域名与二级域名
  10. IGS提供的数据(转)