Java 10 大装 B 写法,看完可以出去吹牛逼了!

Win10系统安装Ubuntu虚拟机,这回真的是零基础!(结尾附NS3的配置) Win10系统安装Ubuntu虚拟机(结尾附NS3的配置) 序幕 本人现在还在念大二,有一门很有趣而且老师讲得也不错的课程《计算机网络原理》。这周老师布置了一个实验《NS3网络模拟》,为了详细记录本次实验过程,顺便也便于自己复习,就写了这篇博客,希望能够对你有帮助! NS3是什么呢?实际上就是一门算法,和计算机网络有关的。不过在我们日常使用的Windows系统上去做这个实验是行不通的,这个实验一定要在Linux系统上进行模拟才能玩的下去,作为一名 Windows选手对此表示不爽但是没办法,为了实验也只 阅读详情

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 这个范围组成的,起到一个标识数字范围的作用而已。至少 Byte 为什么取这个范围,为什么byte取值-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 的幂次,不然会造成空间浪费。另外,HashMap 容量为什么总是为 2 的次幂?这篇推荐看下。

4、复制变量

transient Collection<V> values;

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

以上同样来自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(数字)

  • ? - 不确定类型

上面的泛型我们应该有常见到吧,边界和通配符不懂的可以看下这篇文章吧:困扰我多年的Java泛型 和 ,终于搞清楚了。

泛型要学会用,学好能装B。

6、Lambda

Lambda 表达式这是 Java 8 里面添加的新特性,用来简化匿名内部类以及结合函数式接口编程用的。

如下面创建线程的示例:

// 1
Runnable runnable = () -> System.out.println("javastack.cn");
new Thread(runnable).start();

// 2
new Thread(() -> System.out.println("javastack.cn")).start();

// 3
new Thread(() -> clean()).start();

三个不同的写法,我们再也不用写new Runnable()的一大堆 的匿名内部类了,是不是很清爽了!

如果你还不会用Lambda表达式,那真的 OUT 了,可以关注微信公众号:Java技术栈,在后台回复:新特性,我已经写了一大堆教程了。

下面是一个Lambada真实案例:

@Bean
public 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 方法分别用到了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技术栈,在后台回复 "新特性" 获取这篇文章完整版。

不知道的可能上来就一顿骂了,你流关闭动作在哪,为什么不关闭流,多跟着栈长学点新知识吧,哈哈。

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) {
    // ...
}

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

计算机控制技术及应用 《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。 立即下载

相关推荐

【博弈论】势博弈(potential game)、EPG以及最佳响应、Nash均衡和帕累托(pareto)最优的理解

文章目录前言一、Potential game二、Nash均衡和Pareto-optimal(帕累托最优)1.Nash 均衡2.Pareto最优三、Best response(最佳响应)四、Exact potential game(EPG)1.合作-傀儡博弈2.合作博弈3.傀儡博弈4.自激博弈5.双边对称交互博弈使用理解 前言 本文主要详细讲解potential game的概念以及Exact potential game 的定义和分类,以及这么博弈方法是如何在论文中引入并使用的,本文仅是对自己在该模块

weixin_44535200的博客 2万+

HashMap JDK1.7源码分析

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录前言一、HashMap二、使用步骤1.引入库2.读入数据总结 前言 HashMap JDK1.7源码分析,以及一些总结 一、HashMap 示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。 二、使用步骤 1.引入库 代码如下(示例): import numpy as np import pandas as pd import matplotlib.pyplot as plt import

weixin_38192104的博客 342

基于 CodeMirror 6 与 Vite 构建极简在线代码编辑器的核心原理与实践

在线代码编辑器是前端开发领域的重要工具,它允许开发者在浏览器中直接编写、运行和调试代码。其核心原理通常基于成熟的编辑器内核(如 CodeMirror 或 Monaco Editor)与实时预览技术,通过 iframe 沙箱实现代码的安全执行。这类技术的核心价值在于提供了轻量级、可嵌入、零配置的编码环境,极大地提升了代码演示、教学、快速原型验证的效率。在实际应用中,它常被集成到技术文档、在线教程和协作平台中,用于创建可交互的示例。本文以 **CodeMirror 6** 和 **Vite** 构建的极简编辑器

weixin_30652491的博客 337

HashMap扩容机制(JDK1.8)-- 源码鉴赏与启发

1.介绍HashMap的几个重要的变量 2.HashMap扩容机制是什么? 3.为什么是2的n次幂? 4.我们可以获得什么启发?

[ta叫我小白]的专栏 2471

易康eCognition9.0分类|规则集和机器学习的方法的面向对象的多尺度分割分类

基于易康eCognition9.0软件的规则集和机器学习的方法的面向对象的多尺度分割分类

weixin_46493028的博客 1万+

Python爬虫实战:5分钟搞定Web of Science文献批量导出与解析(附完整代码)

本文提供了一套利用Python爬虫技术,快速实现Web of Science文献批量提取与解析的完整方案。通过解析官方导出的HTML文件,结合BeautifulSoup和pandas库,可将文献数据自动转换为结构化的Excel/CSV表格,帮助科研人员高效管理文献信息,节省大量手动整理时间。

weixin_29050513的博客 1171

java装逼的话_唉,因为 Java 的装逼简化炫技写法背锅了!

点击蓝色小字关注!关注一下你就不会有bug!避免所谓聪明的编程技巧对于交换两个变量的内容,在 C/C++ 中存在一种这样的编程技巧:1intx=1111;2inty=2;3x^=y^=x^=y;4cout<这样一个简单的连续异或就能解决变量的交换问题,这种写法在很久以前是为了减少临时变量的使用,所以这种做法在现在也得到了保留。首先看这样一个问题,表达式 x^=y,在 C/C++ ...

weixin_34693059的博客 367

SNN系列|编码篇(2)时序编码

Tempotral Coding 选择编码方法是要根据编码对象以及模型如何处理编码信息进行选择,如下是一种时序信息的编码对比: Threshold-based encoding 又称为tempotral contrast,该方法可以用于编解码一段序列,当差值超过阈值时发放脉冲,阈值是根据编码的序列自适应变化的。 使用该编码方法时,实值序列最好是沿时间变化的,因为在根据差分决定是否发放脉冲后,脉冲的顺序与差分顺序有关。 Time-to-first spike coding 该编码方法将信息用神经元首次

Tianlong Lee的博客 1万+

那些隐藏的比较深的JAVA基本功装逼姿势,要面试的来看看

float f=3.4;是否正确? 答:不正确。3.4是双精度数,将双精度型(double)赋值给浮点型(float)属于下转型(down-casting,也称为窄化)会造成精度损失,因此需要强制类型转换float f =(float)3.4; 或者写成float f =3.4F;。 访问修饰符public,private,protected,以及不写(默认)时的区别? 答: 修

非鹭千里 2804

第十五届蓝桥杯省赛C/C++B组H题【拔河】题解(AC)

由于枚举三个点肯定会超时,所以只能枚举两个点,我们尝试枚举第一个区间。的复杂度,需要找出右区间中和左区间的和最相近的值,可以考虑使用。一开始,我们将所有可能的右区间的区间和,都插入。做法同上,用前缀和优化数组求和的过程。的数组和差值最小是多少,其中。递增进行枚举左区间,当。的数组,求两个子数组。为左端点的区间的和。

一只大采集~ 5283

Geant4学习——入门(基本概念、Geant4工具包的结构、强制类、可选类)

Geant4是由欧洲核子研究组织基于C++面向对象技术开发的蒙特卡罗应用软件包,用于模拟粒子在物质中输运的物理过程。由于具有良好的通用性和扩展能力,Geant4在涉及微观粒子与物质相互作用的诸多领域获得了广泛应用。 第一部分 Geant4的基本概念 HEP中的模拟是“虚拟现实”。仿真既可用于在研发阶段帮助设计探测器,又可用于物理研究中了解探测器的响应。为了创建这样的虚拟现实,我们需要对粒子间的相互作用,几何形状和材料进行建模,以便将基本粒子传播到检测器中。我们还需要描述检测器生成原始数据的灵敏度。 Gea

M_M-铭的博客 2万+

Java 10 大装 B 写法,看完可以出去吹牛逼了!(1)

面试难免让人焦虑不安。经历过的人都懂的。但是如果你提前预测面试官要问你的问题并想出得体的回答方式,就会容易很多。此外,都说“面试造火箭,工作拧螺丝”,那对于准备面试的朋友,你只需懂一个字:刷!给我刷刷刷刷,使劲儿刷刷刷刷刷!今天既是来谈面试的,那就必须得来整点面试真题,这不花了我整28天,做了份“Java一线大厂高岗面试题解析合集:JAVA基础-中级-高级面试+SSM框架+分布式+性能调优+微服务+并发编程+网络+设计模式+数据结构与算法等”

2401_84407923的博客 664

PCL 三维重建 泊松曲面重建算法

本文介绍了基于泊松曲面重建算法的三维重建过程。泊松重建是一种利用点云数据生成三维表面的算法,它基于点云的法线估计和泊松方程的求解,能够生成光滑且连续的曲面模型。该方法适用于复杂形状和细节的表面重建。

纵马踏花向自由 1090

Java 10 大装 B 写法,看完可以出去吹牛逼了

想不想学习装 B 式的 Java 骚操作花式写法? 没错,一文交会你! 1、集合初始化 集合的创建、赋值一步到位,想不想学? 来,上边跟我一起画个 List,在你下边画一个Map…… 哈哈,高大上的写法,栈长以前写过,写法虽然是很装X,然而并没有什么卵用。 2、算术 注意到上面size的写法没有? 明明可以写成: finalintsize=256; 他非要写成: finalintsize=-(-128)+127+1; 这么装 B 的写法来自...

代码界的扛把子 545

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Java 10 大装X 写法,看完可以出去吹牛逼了,不明白就来看看本文!

想不想学习装 B 式的 Java 骚操作花式写法? 没错,本文栈长来教你! 1、集合初始化 集合的创建、赋值一步到位,想不想学? 来,上边跟我一起画个 List,在你下边画一个Map…… 哈哈,高大上的写法,栈长以前写过,写法虽然是很装X,然而并没有什么卵用。 2、算术 注意到上面size的写法没有? 明明可以写成: final int size = 256; 他非要写成: final int size = -(-128) + 127 + 1; 这么装 B 的写法来自 JDK 包装类java.lan

weixin_46898270的博客 1090

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

不同行业的java面试题(吹牛逼版)

家人们,Java面试现在都卷成麻花了!你吭哧吭哧背八股文,人家开口就是千万并发、微服务架构,直接把CRUD选手整不会了。别慌!这就扒开各行业面试的底裤——新能源车企跟你聊车联网,其实后台还在修Bug;金融系统吹TCC事务,出了事照样甩锅程序员;电商秒杀说起来高大上,崩了还不是重启大法好。记住:面试如戏全靠演技,八股文要背更要活用,吹牛适度防翻车。跟着我混,保你在面试江湖杀出一条血路!

m0_73692704的博客 610

如何判断程序员是在装逼还是有真本事?

程序员是一个十分特殊的群体,他们十分内敛、腼腆,但是只要一开口就能判断出来,到底是在装逼还是有真本事,不信咱们往下看!1、这个功能是小case,分分钟搞定一般情况下,程序...

数据与算法之美 332

Golang - 开篇必须吹牛逼

Golang - 开篇必须吹牛逼 目录 Golang - 开篇必须吹牛逼 Go牛逼吗 安装环境 Golang - 开篇必须吹牛逼 (1)我们为什么要学 高并发 深度 || 广度 (2)go学习思路和目标 多打多练 掌握go语言 做一个并发相关的案例 G...

deng6648的博客 274
上一篇: Java:如何更优雅的处理空值?
下一篇: 总结了大量的 Java 代码精简之道,非常棒!
Java奥利给
博客等级 码龄6年 150粉丝 154原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值