java8~9核心功能
文章平均质量分 70
介绍java8~9新功能特性,java8~9与之前版本有很多差别,特别是lambda表达式、多线程、函数式编程、模块化等。我们需要一些示例,快速掌握这些新的特性,增强开发效率和开发能力。
梦想画家
开源软件爱好者,乐于博客分享,业余时间喜欢跑步和科幻,希望与意趣相投朋友一起学习交流。
展开
-
如何在Java中调用Python
本文介绍了如何从Java调用Python脚本,使用jython脚本引擎比ProcessBuilder类更简单。另外Python可以便捷搭建http应用,Java也可以通过HTTP协议直接调用HTTP服务实现交互。参考内容:https://www.baeldung.com/java-working-with-python。原创 2023-04-30 21:54:45 · 5990 阅读 · 1 评论 -
RSA公钥加密机制跨语言应用实战
RSA, 即 Rivest–Shamir–Adleman,是非对称加密算法。不同于对称加密算法(如AES、DES),它需要两个密钥,公钥可共享给任何人,用于加密信息;私钥仅我们自己保存,用于解密数据。X.509 是定义公钥证书格式的标准,用于描述公钥及其他信息。PKCS8 是存储私钥的标准。为了安全起见,可以使用对称加密算法对私钥再次进行加密。该标准不仅可以处理RSA私钥,还可以处理其他算法。PKCS8私钥通常通过PEM编码格式进行交换。原创 2023-02-12 20:12:46 · 1493 阅读 · 0 评论 -
快速掌握Reactor Core实现响应式编程
在本文我们给出Reactive Core概述,并解释了如何发布和订阅流、应用反压、对流进行操作以及异步处理流数据。学习这些内容希望能对你有帮助,为编写响应式应用程序打下基础。原创 2022-09-28 15:56:52 · 4685 阅读 · 0 评论 -
同步Java ArrayList实战教程
本文介绍了两种方式实现同步ArrayList,希望对你有帮助。原创 2022-09-27 12:10:31 · 557 阅读 · 0 评论 -
Spring Integration 快速入门教程
本文简单演示了基于Java 配置Spring Integration示例,集成应用可以作为单独的应用运行,也可以作为企业级应用的一个部分。虽然它不直接与其他以EAI为中心的产品和模式(如企业服务总线)竞争,但它是一种可行的、轻量级的替代方案,可以解决许多需要构建ESB才能解决的问题。原创 2022-09-06 15:52:46 · 7442 阅读 · 1 评论 -
给Jsoup设置代理
本文介绍如何给Jsoup增加代理,主要有两类原因需要增加代理:;当见到该异常时,我们需要给Jsoup设置代理,否则不能访问外部网络。防止IP被封:另外一种情况是防止网站封锁我们的IP地址。也就是说,使用代理(多个滚动代理)可以更可靠解析HTML,避免因为封锁IP地址让代码停止运行。...原创 2022-08-19 08:32:50 · 3112 阅读 · 2 评论 -
Flink快速入门教程
本文简要介绍了Apache Flink框架,并通过示例展示如何使用一些转换API,包括利用DataSet API实现单词频次计算,利用DataStream API 实现简单实时事件流转换。原创 2022-08-17 12:11:15 · 2624 阅读 · 0 评论 -
Java访问OrientDB数据库实战教程
OrientDB是开源多模式NoSQL数据库,支持图、文档、key-value、地理空间等多种存储模式;同时支持SQL语法进行查询交互,本文介绍OrientDB数据库的Java api。原创 2022-07-10 21:26:24 · 1168 阅读 · 0 评论 -
Java 创建kafka主题
本文简要介绍Apache Kafka,并使用Java编码方式创建、配置kafka主题。Kafak 介绍Apache Kafka是强大、高性能、分布式的事件流平台。通常生产者应用程序发布事件到Kafka,消费者订阅这些事件以便读取和处理它们。Kafka使用主题来存储和分类这些事件,例如,在一个电子商务应用程序中,可能有一个“订单”主题。Kafka主题是分区的,它将数据分布在多个代理上以实现可伸缩性。分区可设置副本,从而使数据具有容错性和高可用性。主题还可设置保留策略,便于后期使用。这些都可以通过Ka.原创 2022-03-30 17:05:14 · 3336 阅读 · 0 评论 -
Java二分搜索算法实现教程
本文解释基于线性结构的二分查找算法,并给出几种实现的代码示例。需求场景假设电商系统中,每天大量用户访问产品页面,用户可以设置低于一定价格的条件过滤产品,并从过滤结果中选择商品加入购物车。因每秒同时有大量用户通过设置价格上限过滤产品,结果展示需要非常块。后端在产品列表采用线性搜索算法与用户输入价格进行比较,然后返回符合条件的产品。这样时间复杂度为O(n). 这意味着产品越多,效率越低。如果我们对产品按价格排序进行存储,然后使用二分查找,那么实现时间复杂度为O(log n). 使用二分搜索,搜索结果所.原创 2022-03-24 17:24:34 · 1137 阅读 · 1 评论 -
给JVM应用注册关闭钩子函数
启动一个服务相对容易,但有时我们需要能控制并优雅地关闭服务。本文介绍几种不同方式终止JVM应用,然后使用JAVA API管理JVM关闭回调。关闭JVM有两种放啊是关闭JVM:控制进程意外方式下面几种情况也属于控制进程关闭JVM:最后的非精灵现场终止,例如当主线程结束时,JVM开始关闭进程。从操作系统发送中断信号,例如,按CTRL+C或注销操作系统通过Java代码调用 System.exit()当我们希望JVM优雅地关闭,但有时JVM可能被异常方式关闭:从OS发送kill信号.原创 2021-11-28 19:48:19 · 885 阅读 · 0 评论 -
Java LinkedList 教程
本文介绍Java LinkedList数据结构。它常用于实现stack、queue,graph,另外稀疏矩阵的存储,HashMap为了防止hash code冲突也用到。LinkedList 同时实现了List 和 Deque接口并实现了所有可用的方法,并支持元素为null 。LinkedList特性这里列举最常用的一些特性:访问元素必须从头或尾开始遍历不是同步的Iterator 和 ListIterator 迭代器是快速失败模式(即迭代器创建之后,如果list被修改了,则会抛出Concur.原创 2021-09-27 14:47:14 · 335 阅读 · 0 评论 -
Apache Commons Collections Bag 教程
本文带你了解 Apache Commons Collections Bag,它允许多次存储相同元素。Bag 与 Collection的差异首先,我们加入maven依赖,然后通过示例进行说明:<dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-collections4</artifactId> <version>4..原创 2021-09-27 10:40:54 · 454 阅读 · 0 评论 -
深入理解Java TreeMap
本文我们学习Map的另一个实现TreeMap。它可以让key默认按照自然顺序排列,或提供比较器实现自定义排序。同时也和Map的另外两个实现(HashMap和 LinkHashMap)的相似性进行对比。TreeMap键顺序本节介绍TreeMap默认顺序,自定义键顺序。同时介绍TreeMap键顺序特性的应用。缺省顺序TreeMap默认按照自然顺序对键排序,对数字按升序,字符串按照字母顺序。请看示例:@Testpublic void givenTreeMap_whenOrdersEntriesNa.原创 2021-09-25 21:09:59 · 557 阅读 · 0 评论 -
深入理解Java LinkedHashMap
本文我们深入Java Map接口的一个实现类LinkedHashMap的内部。它是HashMap的子类,继承了父类的核心代码。因此读者应该先了解HashMap的工作原理。LinkedHashMap 与 HashMap*LinkedHashMap *在大多数方面 与 HashMap 类似,但LinkedHashMap 是基于hash 表与链表结构用于增强hashMap。其底层除了有缺省为16大小的数组外,还维护了一个双向链表连结所有项。为了维护元素顺序,LinkedHashMap 修改了 Hash.原创 2021-09-18 11:38:48 · 1185 阅读 · 0 评论 -
Java 8 使用索引方式迭代流
Java 8 Stream 不是集合,不能通过索引方式访问。本文介绍几种方法实现,包括 IntStream, StreamUtils, EntryStream, 以及 Vavr的 Stream。1. 使用普通Java类实现我们可以使用 Integer 范围遍历流,这样可以通过索引方式访问数组或集合中的元素。下面示例展示如何访问字符串数组,仅或取索引为偶数的元素。public List<String> getEvenIndexedStrings(String[] names) { .原创 2021-08-05 12:34:31 · 604 阅读 · 0 评论 -
Java把堆栈跟踪转成字符串
在Java异常处理过程中,通常记录日志或在控制台直接显示。但有时不仅仅需要打印,还需要写至文件或数据库、甚至需要通过网络传输至日志处理中心。这样就需要把堆栈跟踪信息转成字符串,但Java默认没有提供直接的方式进行实现。利用Java 核心 API 实现首先我们使用 java 核心库进行实现。Exception 类的 方法 printStackTrace() 可以带一个参数 ,可以是 PrintStream 或PrintWriter ,因此,可以使用 StringWriter 打印堆栈信息为字符串:.原创 2021-06-29 22:17:06 · 2190 阅读 · 0 评论 -
介绍 Java Service Provider Interface
大多数应用中我们使用依赖注入让代码保持松耦合,但有时我们仅需要简单DI,而不是其他较重的框架,如Spring ,Google Guice 等,它们会让jar包非常大,增加了很多不必要的类。Java 自身也提供了 ServiceLoader 类 ,用于运行时注入依赖。ServiceLoader 自JDK 3引入仅作内部使用,到JDK6,该类范围为public,但仍然是final类 —— 我们不能扩展其功能。ServiceLoader 在 JDK 9 中扮演重要角色。本文通过示例给你展示如何使用 Servi.原创 2021-06-29 16:53:36 · 612 阅读 · 0 评论 -
创建自定义AOP Annotation
本文我们自定义Spring AOP Annotation。首先介绍AOP的概念,了解其优点。接着通过实例一步步带你实现一个日志注解,让更深理解AOP Annotation。什么是AOP AnnotationAOP即面向方面编程,本质上是给已存在的代码增加行为,而不需要修改原有代码。AOP更多细节包括 pointcut 和 advice ,读者可自己搜索更多内容,本文认为你已经了解这些基本概念。我们实现的AOP是通过注解驱动,我们可能对事务注解 @Transactional 非常熟悉。@Trans.原创 2021-05-28 19:03:22 · 439 阅读 · 0 评论 -
使用JavaFaker生成测试数据
之前为了生成大量测试数据写了一些工具。现在发现JavaFaker非常强大,可以生成各种类型数据,包括地址、流行文化等,且支持locale国际化。本文带你学习JavaFaker,通过示例展示如何使用FakeValueService和 Faker 类,后面再介绍locale,让生成的数据属于特定地域。1. 加入依赖包maven依赖如下:<dependency> <groupId>com.github.javafaker</groupId> <.原创 2021-05-21 15:48:43 · 3816 阅读 · 1 评论 -
Java事务从入门到精通
本文介绍在Java中事务概念,包括JDBC、JPA、JMS事务处理方式。本文主要讲解本地事务,不涉及分布式事务。理解本文后有助于理解Spring的事务处理机制。1. 什么是事务在Java中一般任务事务时一些列动作必须都成功完成。因此如果一个或多个动作失败,则所有其他动作必须回滚保持应用状态不变,必须确保应用状态整体性不受破坏。事务可能涉及一个或多个资源,如数据库、消息队列。从而产生在事务下执行不同动作的方式。包括涉及独立的本地资源事务,亦或多个资源参与的全局事务。2. 本地资源事务我们将首先探讨如原创 2021-04-17 22:07:53 · 461 阅读 · 0 评论 -
java实现获取两个list交集
如何获取两个list的交集,使用java8 的stream实现非常容易。java流实现创建两个字符串list,两者都有重复的元素:List<String> list = Arrays.asList("red", "blue", "blue", "green", "red");List<String> otherList = Arrays.asList("red", "green", "green", "yellow");下面使用流方式获取交集:Set<String原创 2021-03-31 20:21:39 · 5102 阅读 · 1 评论 -
Apache Commons Lang 3 教程
Apache Commons Lang 3 是非常流行的库,包括很多功能齐全的工具类,可以扩展Java的能力。其中内容相当丰富,包括字符串、数组以及数值操作,反射和并发,以及几个顺序数据结构实现(pair和triple)。本文带你学习这些工具类的应用。引入依赖<dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId&原创 2021-03-29 22:10:28 · 3266 阅读 · 0 评论 -
ArrayList容量和数组大小区别
java可以创建固定大小数组或使用列表类实现类似功能。本文我简要说明下ArrayList容量和数组大小区别,同时也说明初始化ArrayList时如何指定其容量大小。1. 示例展示两者差异首先创建数组,java需要强制指定大小。Integer[] array = new Integer[100]; System.out.println("Size of an array:" + array.length);这里指定数组大小为100,结果为:Size of an array:100接着创建Arra原创 2021-03-28 21:13:02 · 2472 阅读 · 0 评论 -
合并两个已排序的数组
如何合并两个已排序数组至单个新的排序数组。算法假设有两个已排序数组 arr1 和 arr2,长度分别为len1、len2。接着我们定义结果数组,长度为len1+len2。我们在同一个循环中便利两个数组,通过对每个数组维护一个位置索引post1和post2。对于每个迭代,比较两个数组元素,较小的元素存入结果数组中,对应数组的位置索引移动至下一个。直到遍历完其中一个数组的所有元素,最后拷贝另一个数组中余下的元素至结果数组中。实现过程下面给java实现代码,结合上述算法描述增加了注释。public原创 2021-03-26 15:13:45 · 1438 阅读 · 0 评论 -
矩阵乘法Java实现
本文介绍几种方式实现矩阵相乘。矩阵概念一般语言没有提供,我们首先子句实现,同时也介绍一些现成库实现。1. 概念介绍首先通过示例介绍矩阵,首先定义第一个3x2的矩阵:我们再定义第二个2x3的矩阵:两个矩阵相乘,结果为3x4矩阵:计算公式为:第一个矩阵的列数要和第二个矩阵的行数相等,否则不能相乘。即从A矩阵的第一行开始依次和B矩阵的每列相乘,每行与列元素相乘的结果相加作为结果矩阵的一个元素。2. 矩阵乘法实现2.1 自己实现首先我们自己实现矩阵相乘,为了简单我们使用二维double类型原创 2021-02-18 15:39:02 · 6853 阅读 · 0 评论 -
介绍Java -D 命令行参数
介绍Java -D 命令行参数我们在ide中执行程序经常需要设置VM参数,运行maven命令也需要设置参数,都是通过-D设置参数值。本文带你了解-D命令行参数。1. 什么是Java -D命令行参数参考官方文档的描述:语法:-Dproperty=value设置系统属性值。如果字符串包括空格,则必须使用双引号括起来。如:java -Dfoo=“some string”-D是用于设置环境属性值的重要方式。JVM运行时包括很多系统属性,我们可以通过-D选项配置系统属性,并在D后面紧接着属性名称和等号,然原创 2020-11-08 11:06:10 · 10986 阅读 · 0 评论 -
Java 实现不可变Map
Java 实现不可变Map有时不希望修改java.util.Map,如线程间的共享数据。为此我们可以使用Unmodifiable Map 或 Immutable Map。本文讨论两者之间差异,然后给出不同方式创建不可变Map示例。1. Unmodifiable vs Immutable不可修改map是对map的包装,它不允许对其进行直接修改:Map<String, String> mutableMap = new HashMap<>();mutableMap.put("US原创 2020-11-05 22:43:12 · 1416 阅读 · 0 评论 -
Java生成安全随机密码
Java生成安全随机密码本文讨论在Java中使用多种方法生成安全随机密码。我们示例中约定安全密码包括10个字符,至少包括两个小写字母、两个大写字母、两个数字以及两个特殊字符。1. 使用PassayPassay是非常强大的密码策略工具库,我们可以利用其生成符合特定规则的密码,读者可以参考上篇博文。通过使用CharacterData 缺省实现,可以规划密码规则,当然也能根据需要自定义CharacterData 。public String generatePassayPassword() { P原创 2020-11-01 17:07:51 · 4434 阅读 · 0 评论 -
Passay库实现强大安全的密码策略
Passay库实现强大安全的密码策略本文讨论在Java中使用多种方法生成安全随机密码。我们示例中约定安全密码包括10个字符,至少包括两个小写字母、两个大写字母、两个数字以及两个特殊字符。1. Passay库一般大多数web应用有自己的密码策略————也就是强制用户创建难以破解的复杂密码。我们可以利用Passay库生成或检查密码,使用Passay库需要增加相应依赖:<dependency> <groupId>org.passay</groupId>原创 2020-10-31 13:15:18 · 2702 阅读 · 1 评论 -
Java 在运行时修改注解参数值
Java 在运行时修改注解参数值注解是在java代码中增加一种元数据,这些元数据可以嵌入在class文件中在编译时处理,也可以保留至运行时通过Reflection进行访问。本文讨论如何在运行时修改注解值,我们示例使用类级别注解。1. 注解Java允许使用现有注解创建新的注解。最简单的注释形式是@符号后接注释名:@Override下面创建自定义注解Greeter:@Retention(RetentionPolicy.RUNTIME)public @interface Greeter {原创 2020-10-25 17:14:44 · 5542 阅读 · 2 评论 -
Java检查类是否存在
Java检查类是否存在对于决定使用哪个接口的实现类,检查类的存在性非常有用。本文我们探索 Class.forName()方法检查类路径下是否存在特定类的一些细节差异。1. 使用Class.forName()使用java反射检查类的存在性,对于 Class.forName()方法,其文档中指出如果类不存在则抛出 *ClassNotFoundException*异常。1.1 检测ClassNotFoundException异常首先我们写个测试期望抛出ClassNotFoundException异常,这原创 2020-09-26 11:30:51 · 4512 阅读 · 0 评论 -
使用Java反射检查静态方法
使用Java反射检查静态方法本文讨论如何通过Java反射检查静态方法。1. 为了演示,我们定义包含几个静态方法的StaticUtility类:public class StaticUtility { public static String getAuthorName() { return "Umang Budhwar"; } public static LocalDate getLocalDate() { return LocalDate原创 2020-09-26 09:41:11 · 1450 阅读 · 0 评论 -
Java 遍历枚举值
Java 遍历枚举值枚举是Java中数据类型,用于将一组预定义常量赋给变量。本文介绍几种方式遍历枚举值。1. 定义枚举首先我们定义枚举,简单示例如下:public enum DaysOfWeekEnum { SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY}Enum类型没有提供迭代方法,如forEach() 或 iterator(), 我们可以使用其val原创 2020-09-19 09:18:46 · 50149 阅读 · 0 评论 -
Java 实现校验和(Checksum)
Java 实现校验和(Checksum)本文简要解释什么是校验和以及如何在java中计算校验和。1. 校验和及实现算法校验和是指传输位数的累加,当传输结束时,接收者可以根据这个数值判断是否接到了所有的数据。如果数值匹配,那么说明传送已经完成。通常用来在通信中,尤其是远距离通信中保证数据的完整性和准确性。简言之,校验和是二进制数据流的迷你表示。在网络编程中通常用于检查信息是否完整接收,在接收到新消息时,可以重新计算校验和并与接收到的校验和进行比较,以确保没有丢失任何字节位。此外,它们还可以用于文件管理原创 2020-09-15 08:54:32 · 10842 阅读 · 0 评论 -
Java 8 谓词(Predicate)链
Java 8 谓词(Predicate)链本文介绍多种方式实现谓词链接。1. 从示例开始我们先从一个简单示例开始,如何实用简单谓词过滤集合:@Testpublic void whenFilterList_thenSuccess(){ List<String> names = Arrays.asList("Adam", "Alexander", "John", "Tom"); List<String> result = names.stream() .f原创 2020-09-10 17:44:45 · 982 阅读 · 0 评论 -
Java检查字符串包含多个关键词
Java检查字符串包含多个关键词本文介绍如何在字符串中监测多个关键词。1. 需求说明String inputString = "hello there, java";我们的任务是在 inputString中查找是否有 hello 和 java 两个单词。把要查找的关键词放入数组中:String[] words = {"hello", "java"};查找的顺序不重要,但应该需要大小写敏感。2. 传统方法2.1 String.contains()我们首先使用 String.contai原创 2020-08-27 17:44:53 · 13295 阅读 · 0 评论 -
Java 解析括号内子字符串的内容
Java 解析括号内子字符串的内容本文介绍Java几种方式解析字符串中括号内字串。1. 问题描述假设String input = "test data (测试)",现在需要获取括号内的测试字串。也有可能给定字符串包括多个括号组:String input = "test data (测试)(data)" ,解析结果为:测试 和 data 。2. 多种方式实现2.1 直接定位我们首先想到的直接使用 String的indexOf方法进行定位:String input = "test data原创 2020-08-21 18:04:57 · 7243 阅读 · 0 评论 -
Java 8 流peek() API
Java 8 流peek() API本文介绍了Java 8 流peek()api,因为其通常被误解或误用。1. 从示例开始首先从示例开始,在控制台中打印字符串流,因为peek需要Consumer 作为参数,尝试代码如下:Stream<String> nameStream = Stream.of("Alice", "Bob", "Chuck");nameStream.peek(System.out::println);但上述代码没有输出,这是为什么?回顾下流,其有三个部分,数据源,原创 2020-05-22 12:46:04 · 5661 阅读 · 1 评论 -
介绍Java7的工具类Objects
介绍Java7的工具类Objects本文介绍Java7引入的工具里Objects,使用其API可以让代码更简洁。1. 概述在jdk7添加了一个objects工具类,它提供了一些方法来操作对象,它由一些静态的实用方法组成,这些方法是null-safe (空指针安全的)或null-tolerant(容忍空指针的),用于计算对象的hashcode、返回对象的字符串表示形式、比较两个对象。Obje...原创 2020-04-19 21:25:50 · 336 阅读 · 0 评论