zjjfly's blog

Java,Clojure,Scala...

0%

从Java18到21

随着Java最新版本21的推出,其中的新特性之一:虚拟线程,受到广泛关注。笔者觉得有必要对从Java18到21的所有主要的新特性做一个盘点,就像之前的《学习Java9~11》《学习Java12~17》

虚拟线程

毫无疑问,虚拟线程是所有的新特性中最重要的一个。在此之前,Java中的线程实际是对操作系统的线程的包装,而操作系统的线程的创建代价比较高昂,如果你在线程中发送HTTP请求到另一个服务器,其中发送请求和处理响应只占线程阻塞的时间的一小部分,大部分时间是在等待响应。避免这种情况的一个方式是使用异步方式,但这种方式的缺点是实现较复杂。而有了虚拟线程,你能够在不改变实现的情况下获得和异步一样的伸缩性。

Read more »

从Java 8迁移至Java 17

升级Java和Maven

首先安装Java 17,并把JAVA_HOME改成新版本的安装路径。还需要升级Maven版本,尽量用最新的版本,因为旧版本并不支持Java 17。在IDE修改项目使用的JDK和Maven。然后,在pom.xml中,加入或修改下面的配置(如果有配置<java.version>,要删除):

1
2
3
4
<properties>
<maven.compiler.target>17</maven.compiler.target>
<maven.compiler.source>17</maven.compiler.source>
</properties>

如果有显式地配置compiler plugin,则也需要修改:

1
2
3
4
5
6
7
<plugin>    
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>17</source>
<target>17</target>
</configuration>
</plugin>
Read more »

Mockito-inlineMockito 的一个分支,它提供了一种新的方法来模拟方法调用,称为内联模拟。内联模拟可以让你在调用方法时直接指定返回值,而不是在调用完方法后再设置返回值。这种方式的优点在于可以简化代码,并且更容易阅读和维护。相比于PowerMock,它对代码的侵入性更小(PowerMock的原理是改写类的字节码),而且有更好的社区支持(PowerMock已经两年多没有发布新版本)。所以,使用Mockito-inline替代PowerMock应该是未来的趋势。

Read more »

本文列举了一些从Java12到17的一些比较重要的特性

switch表达式

新的switch表达式:

1
2
3
4
5
var i = switch (args[0]) {
case "a" -> 1;
case "b" -> 2;
default -> 0;
};

可以看出有两个变化:

  • 在匹配成功之后不再需要break来终止继续的匹配
  • 表达式可以直接给变量赋值
Read more »

这是”Python Tricks”一书的读书笔记。什么是Python Tricks?就是一小段Python代码,它既传授了Python语言的一个特性,也是一个让你深入发掘这一特性的驱动力。

本文是该书第二章”写出更简洁的Python”的读书笔记。这里的简洁不止意味的代码量的少,还是指不需要加很多注释就可以让别人看懂,即可读性高。

Read more »

Java9

模块化

模块化有两个目标:

  • 对JDK本身进行模块化
  • 提供一个应用程序可以使用的模块系统

它们是密切相关的,JDK的模块化可通过使用与应用程序开发人员使用的相同的模块系统来实现.通过引入模块化系统,使得Java真正的获得了对模块的三个核心原则的支持.
它带来的最重要的几个好处是:

Read more »

1.Java7新特性速览

1.1 语法变化

1.1.1 switch增强

switch-case语法支持String类型了.在此之前只能用于byte、short、char、int以及它们的包装类型还有枚举类型.

1
2
3
4
5
6
7
8
9
10
11
String name = "jjzi";
switch (name) {
case "zijj":
assertTrue(false);
break;
case "jjzi":
assertTrue(true);
break;
default:
assertTrue(false);
}
Read more »

延迟执行

所有的lambda表达式都是延迟执行的.如果你希望立刻执行,就没必要使用lambda表达式了.延迟执行的原因有很多,例如:

  • 在另一个线程中运行
  • 多次运行代码
  • 在某个算法的正确时间点上运行代码(例如排序算法中的比较操作)
  • 只有在需要的时候运行代码
Read more »

最近碰到一个问题,在看<<快学Java8>>的时候,作者让写一段代码比较使用parallel stream和一般的stream的性能差异,书中说直接使用System.currentTimeMillis()记录时间,然后比较耗时长短,结果却发现执行相同的任务(统计<<战争与和平>>这本书中的长单词数量)并行流所花的时间居然比一般的流更长,这显然不符合预期。google之后,在StackOverflow看到一个人说那样测试性能不准确,他推荐使用JMH。改用JMH之后,我最终得到了期望的结果。
JMH是一个microbenchmark测试框架,是由OpenJDK的开发人员开发的,所以其结果具有很高的可信性,而且它用起来和JUnit一样的方便。下面是官方的hello world示例:

Read more »

聚合

如果你想用一种方式计算流的元素的合或者把它们组合成一个结果,你可以使用reduce方法.它接收一个二元函数并不断应用它,第一次的参数是是流的前两个元素,然后是第一次调用的结果和流的第三个元素,依次类推,直到流的最后.

1
2
Stream<Integer> values = Stream.of(1, 2, 3, 4, 5);
Optional<Integer> sum = values.reduce((x, y) -> x + y)

这种情况下,reduce计算的是Stream中的数字的和.这个方法返回的是一个Optional,因为Stream可能是空的.你其实可以使用values.reduce(Integer::sum)代替values.reduce((x, y) -> x + y).

Read more »