网站not found,织梦网站首页,部门定制网站建设公司,wordpress小工具音频try-with-resources语句
/** * 在处理必须关闭的资源时#xff0c;使用try-with-resources语句替代try-finally语句。 生成的代码更简洁#xff0c;更清晰#xff0c;并且生成的异常更有用 * java9 之前写法 */
public static String readFile1(String fileName){ tr…try-with-resources语句
/** * 在处理必须关闭的资源时使用try-with-resources语句替代try-finally语句。 生成的代码更简洁更清晰并且生成的异常更有用 * java9 之前写法 */
public static String readFile1(String fileName){ try (Reader inputString new StringReader(fileName); BufferedReader br new BufferedReader(inputString)) { return br.readLine(); } catch (IOException e) { throw new RuntimeException(e); }
} /** * 在处理必须关闭的资源时使用try-with-resources语句替代try-finally语句。 生成的代码更简洁更清晰并且生成的异常更有用 * java9之后写法 */
public static String readFile2(String fileName){ Reader inputString new StringReader(fileName); BufferedReader br new BufferedReader(inputString); try (br) { return br.readLine(); } catch (IOException e) { throw new RuntimeException(e); }
}改进的集合工厂方法
Java 9 提供了一些新的静态工厂方法 List.of(), Set.of(), 和 Map.of() 来创建不可变集合。
示例代码
public static void main(String[] args) { ListInteger list List.of(1, 2, 3); SetInteger set Set.of(1, 2, 3); MapString, Integer map Map.of(one, 1, two, 2, three, 3); System.out.println(list); System.out.println(set); System.out.println(map);
}控制台输出
[1, 2, 3]
[1, 2, 3]
{two2, three3, one1}增强流StreamAPI
takeWhile 方法
takeWhile 方法允许你在满足给定的谓词条件下获取流中的元素直到第一个不满足条件的元素出现为止。
示例代码
public static void main(String[] args) { ListInteger numbers List.of(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); ListInteger takeWhileList numbers.stream() .takeWhile(n - n 5) .collect(Collectors.toList()); System.out.println(Take while: takeWhileList);
}控制台输出
Take while: [1, 2, 3, 4]dropWhile 方法
dropWhile 方法则相反它会跳过流中的元素直到找到第一个满足给定谓词的元素然后返回剩余的所有元素。
示例代码
public static void main(String[] args) { ListInteger numbers List.of(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); ListInteger dropWhileList numbers.stream() .dropWhile(n - n 5) .collect(Collectors.toList()); System.out.println(Drop while: dropWhileList);
}控制台输出
Drop while: [5, 6, 7, 8, 9, 10]ofNullable 方法
ofNullable 方法允许你从一个可能为 null 的值创建一个 Stream如果值不是 null则创建一个单元素流如果是 null则创建一个空流。
示例代码
public static void main(String[] args) { OptionalString optionalString Optional.of(Hello World); StreamString stream Stream.ofNullable(optionalString.orElse(null)); stream.forEach(System.out::println);
}控制台输出
Hello Worlditerate 方法
iterate 方法允许你基于一个初始值和一个迭代函数来创建无限流Java 9 为 iterate 方法增加了一个重载版本允许你指定一个终止条件。
示例代码
public static void main(String[] args) { // 使用 iterate 创建一个无限流直到达到 10 StreamLong infiniteStream Stream.iterate(0L, n - n 1); // 限制流的大小 StreamLong limitedStream infiniteStream.limit(10); limitedStream.forEach(System.out::println); // 使用 iterate 的重载版本直到终止条件为 true StreamLong untilStream Stream.iterate(0L, n - n 10, n - n 1); untilStream.forEach(System.out::println);
}控制台输出
限制流的大小 0 1 2 3 4 5 6 7 8 9
终止条件为 true 0 1 2 3 4 5 6 7 8 9Optional 类的新方法
Java 9 为 Optional 类添加了一些新方法如 ifPresentOrElse 和 or 。
ifPresentOrElse
ifPresentOrElse 方法的作用是如果Optional 中有值则执行指定的操作 如果没有值则执行另一个操作。这个方法可以让我们在处理可选值时避免使用多个if 语句从而使代码更加简洁。
源码
void ifPresentOrElse(Consumer? super T action, Runnable emptyAction)action 如果 Optional 中有值则执行的操作。emptyAction 如果 Optional 中没有值则执行的操作。
示例代码
import java.util.Optional;public class IfPresentOrElseExample {public static void main(String[] args) {// 有值的情况OptionalString optionalValue Optional.of(Hello, World!);optionalValue.ifPresentOrElse(value - System.out.println(Value is present: value),() - System.out.println(Value is absent));// 没有值的情况OptionalString emptyValue Optional.empty();emptyValue.ifPresentOrElse(value - System.out.println(Value is present: value),() - System.out.println(Value is absent));}
}控制台
Value is present: Hello, World!
Value is absentor
or 方法的作用是如果 Optional 中有值则返回该值如果没有值则返回另一个 Optional 。这个方法使得我们可以提供一个备用的值或 Optional 从而避免 null 的情况。
源码
OptionalT or(Supplier? extends Optional? extends T supplier)supplier 如果 Optional 为空则提供一个新的 Optional 。
示例代码
import java.util.Optional;public class OrExample {public static void main(String[] args) {// 有值的情况OptionalString optionalValue Optional.of(Hello);String result1 optionalValue.or(() - Optional.of(Default Value)).get();System.out.println(Result 1: result1); // 输出: Hello// 没有值的情况OptionalString emptyValue Optional.empty();String result2 emptyValue.or(() - Optional.of(Default Value)).get();System.out.println(Result 2: result2); // 输出: Default Value}
}控制台
Result 1: Hello
Result 2: Default Value总结
ifPresentOrElse 方法允许我们在处理 Optional 时优雅地处理有值和无值的情况。or 方法则提供了一种方式来指定备用的 Optional 值以便在原始 Optional 为空时使用。 这两个方法的引入使得 Optional 的使用更加灵活和方便帮助开发者更好地处理可能缺失的值。
反应式流Reactive Streams
Java 9 引入了对反应式编程的支持提供了 Flow 类用于处理异步数据流。 Flow 类是 Java 反应式流Reactive Streams规范的一部分允许开发者以非阻塞的方式处理数据流并支持背压backpressure机制。
Flow 类的核心组件
Publisher发布数据流的对象。Subscriber订阅数据流的对象负责处理接收到的数据。Subscription连接发布者和订阅者的桥梁负责请求数据和控制数据流。Processor既是发布者又是订阅者负责在数据流中进行处理。
示例代码
import java.util.concurrent.Flow;
import java.util.concurrent.SubmissionPublisher;/** * 展示了如何使用 Flow 类创建一个发布者和一个订阅者。 */
public class ReactiveStreamsExample {public static void main(String[] args) {// 创建一个 SubmissionPublisher作为发布者SubmissionPublisherString publisher new SubmissionPublisher();// 创建一个订阅者Flow.SubscriberString subscriber new Flow.Subscriber() {private Flow.Subscription subscription;Overridepublic void onSubscribe(Flow.Subscription subscription) {this.subscription subscription;// 请求1个数据subscription.request(1);}Overridepublic void onNext(String item) {System.out.println(Received: item);// 处理完一个数据后再请求下一个数据subscription.request(1);}Overridepublic void onError(Throwable throwable) {System.err.println(Error: throwable.getMessage());}Overridepublic void onComplete() {System.out.println(Processing complete.);}};// 将订阅者注册到发布者publisher.subscribe(subscriber);// 发布一些数据System.out.println(Publishing items...);for (int i 1; i 5; i) {publisher.submit(Item i);}// 关闭发布者publisher.close();}
}代码解释
SubmissionPublisher这是一个实现了 Publisher 接口的类允许我们手动提交数据。Subscriber我们实现了 Flow.Subscriber 接口定义了如何处理接收到的数据。 onSubscribe 当订阅者与发布者连接时调用负责请求数据。onNext 当接收到数据时调用处理数据并请求下一个数据。onError 处理错误情况。onComplete 处理完成时的逻辑。 数据发布我们在一个循环中发布了5个数据项并在发布后关闭了发布者。
使用场景
实时数据处理 在金融服务中实时处理股票价格、交易数据等信息反应式流可以帮助系统快速响应市场变化。 微服务架构 在微服务架构中各个服务之间通过消息队列进行通信。使用反应式流可以有效地处理来自不同服务的异步消息提高系统的响应能力和可扩展性。 Web 应用程序 在高并发的 Web 应用中反应式流可以用来处理用户请求特别是当请求涉及到数据库查询或外部 API 调用时可以避免阻塞主线程提高用户体验。 数据流处理 在数据分析和 ETL提取、转换、加载过程中反应式流可以用于处理大量数据的流式传输和实时分析。 物联网IoT应用 在物联网应用中设备会不断生成数据反应式流可以帮助处理这些数据流进行实时监控和分析。 其他: 结合当前的特性再应用到合适的场景中
总结
Java 9 的 Flow 类为开发者提供了一种强大的工具来处理异步数据流支持非阻塞操作和背压机制。这使得反应式编程在现代应用中变得越来越重要特别是在需要高并发、高可用性和实时处理的场景中。
JShell交互式命令行工具
JShell 是一个新的命令行工具可以用来快速测试 Java 代码片段而无需创建完整的 Java 程序。
//第一步 输入 jshell 进入
PS D:\project\hot-sauce-2 jshell
| 欢迎使用 JShell -- 版本 17.0.7
| 要大致了解该版本, 请键入: /help intro //第二步 编写代码
jshell int sum(int a, int b) {
... return a b;
... }
| 已创建 方法 sum(int,int) // 第三部 运行第二步代码得到结果
jshell sum(5, 10)
$2 15接口中的私有方法
Java 9 允许在接口中声明私有方法这可以用来实现共享逻辑。
示例代码
/** * 接口 */
public interface MyInterface { // 私有方法 private void printMessage() { System.out.println(This is a private method in an interface.); } // 默认方法 default void display() { printMessage(); }
}/** * 实现*/
public class MyClass implements MyInterface { public static void main(String[] args) { new MyClass().display(); }
}增强Deprecated注解
在 Java 9 中 Deprecated 注解得到了增强提供了更多的信息以帮助开发者理解被弃用的 API 的状态。这一增强主要体现在两个新的元素的引入上
1. forRemoval
类型 boolean说明该元素指示被弃用的元素是否计划在未来的版本中移除。如果设置为 true 表示这个元素在未来的某个版本中会被移除。这个信息对于开发者来说非常重要因为它可以帮助他们决定是否应该立即迁移到替代方案。
2. since
类型 String说明该元素用于指定自哪个版本开始该元素被弃用。这可以让开发者快速了解该 API 的弃用历史从而更好地管理代码的兼容性。
代码示例
public class Example {/*** deprecated This method is deprecated because it is inefficient.* It is recommended to use {link #newMethod()} instead.* * since 9* forRemoval true*/Deprecated(since 9, forRemoval true)public void oldMethod() {// old implementation}public void newMethod() {// new implementation}
}在上面的示例中
oldMethod 被标记为弃用注解中包含了 since 9 表示这个方法从 Java 9 开始被弃用。forRemoval true 表示这个方法计划在未来的版本中被移除。方法的文档注释中也建议使用 newMethod() 作为替代方案。
总结
Java 9 中对 Deprecated 注解的增强使得开发者在使用被弃用的 API 时能够获得更多的上下文信息。这种增强有助于提高代码的可维护性减少未来版本中的兼容性问题促使开发者更早地迁移到更好的替代方案。通过明确标记弃用的原因和计划移除的时间Java 9 使得 API 的管理变得更加清晰和高效。
CompletableFuture API
在 Java 9 中 CompletableFuture API 进行了多项增强使得异步编程更加灵活和强大
1. 新的工厂方法
Java 9 引入了几个新的静态工厂方法增强了 CompletableFuture 的创建和组合能力
CompletableFuture.allOf(CompletableFuture?... futures) 这个方法接受多个 CompletableFuture 对象并在所有给定的 CompletableFuture 完成时完成。适用于需要等待多个异步任务完成的场景。 CompletableFuture.anyOf(CompletableFuture?... futures) 这个方法接受多个 CompletableFuture 对象并在其中任意一个完成时完成。适合用于需要在多个任务中选择第一个完成的任务的场景。 示例代码
import java.util.concurrent.CompletableFuture;public class CompletableFutureExample {public static void main(String[] args) {CompletableFutureString future1 CompletableFuture.supplyAsync(() - {// 模拟耗时操作sleep(1000);return Result from Future 1;});CompletableFutureString future2 CompletableFuture.supplyAsync(() - {sleep(2000);return Result from Future 2;});// 使用 allOf 等待所有任务完成CompletableFutureVoid allOf CompletableFuture.allOf(future1, future2);allOf.join(); // 阻塞直到所有任务完成// 输出结果System.out.println(future1.join());System.out.println(future2.join());// 使用 anyOf 等待任意一个任务完成CompletableFutureObject anyOf CompletableFuture.anyOf(future1, future2);System.out.println(First completed: anyOf.join());}private static void sleep(int millis) {try {Thread.sleep(millis);} catch (InterruptedException e) {Thread.currentThread().interrupt();}}
}2. 异常处理增强
Java 9 对异常处理的支持进行了增强特别是与异常处理和组合相关的方法
handle(BiFunction? super T, Throwable, ? extends U fn) 这个方法允许你在计算完成时处理结果或异常。无论是正常完成还是异常完成都会调用提供的函数。 exceptionally(Function? super Throwable, ? extends T fn) 用于处理异常的函数如果 CompletableFuture 在计算过程中发生异常则会调用这个函数。 示例代码
import java.util.concurrent.CompletableFuture;public class CompletableFutureErrorHandlingExample {public static void main(String[] args) {CompletableFutureString future CompletableFuture.supplyAsync(() - {// 模拟异常if (true) throw new RuntimeException(Something went wrong!);return Result;});future.handle((result, ex) - {if (ex ! null) {System.out.println(发生错误: ex.getMessage());return 备用结果;}return result;}).thenAccept(System.out::println);}
}3. delayedExecutor 方法
Java 9 引入了 delayedExecutor 方法允许你创建一个带有延迟的执行器用于在指定的延迟后执行任务。
delayedExecutor(long delay, TimeUnit unit) 返回一个 ExecutorService 可以用来在指定的延迟后执行任务。 示例代码
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.TimeUnit;public class DelayedExecutorExample {public static void main(String[] args) {// 创建一个带有延迟的执行器ExecutorService executor CompletableFuture.delayedExecutor(2, TimeUnit.SECONDS);CompletableFutureVoid future CompletableFuture.runAsync(() - {System.out.println(任务在延迟后执行);}, executor);// 等待任务完成future.join();System.out.println(主线程结束);}
}4. 超时处理增强
Java 9 还增加了对超时处理的支持
orTimeout(long timeout, TimeUnit unit) 允许设置超时如果在指定的时间内未完成则会自动取消 CompletableFuture 。 completeOnTimeout(T value, long timeout, TimeUnit unit) 允许在指定的超时时间内完成 CompletableFuture 如果在超时之前没有完成则会使用给定的值完成。
总结
Java 9 对 CompletableFuture 的增强使得异步编程更加灵活和强大提供了更好的异常处理机制、组合方式和超时处理能力。通过新增的工厂方法和增强的方法开发者可以更方便地处理并发任务提高程序的响应性和可维护性。这些特性使得 CompletableFuture 成为处理异步编程的重要工具。
ProcessHandle 类增强
在 Java 9 中 ProcessHandle 类得到了增强提供了一些新的特性和方法使得对操作系统进程的管理和监控变得更加方便和高效。以下是 Java 9 中 ProcessHandle 的主要新特性
1. 新增的静态方法
Java 9 引入了一些新的静态方法使得获取当前进程的信息变得更加简单
ProcessHandle.current() 该方法返回当前 Java 进程的 ProcessHandle 实例。通过这个实例开发者可以获取当前进程的 ID、状态等信息。
2. 进程信息获取
通过 ProcessHandle 可以获取关于进程的多种信息
pid() 返回进程的唯一标识符PID。 info() 返回一个 ProcessHandle.Info 对象提供关于进程的详细信息包括命令行、启动时间、用户等。 children() 返回当前进程的子进程的 ProcessHandle 流。可以用于遍历当前进程的所有子进程。 parent() 返回当前进程的父进程的 ProcessHandle 如果存在。
3. 进程状态监控
Java 9 中的 ProcessHandle 提供了对进程状态的监控功能
isAlive() 检查进程是否仍在运行。
4. 进程终止
可以通过 ProcessHandle 来终止进程
destroy() 终止与该 ProcessHandle 关联的进程。
示例代码
import java.util.Optional;public class ProcessHandleExample {public static void main(String[] args) {// 获取当前进程的 ProcessHandleProcessHandle currentProcess ProcessHandle.current();// 打印当前进程的 PIDSystem.out.println(Current Process ID: currentProcess.pid());// 获取进程信息ProcessHandle.Info info currentProcess.info();System.out.println(Command: info.command().orElse(N/A));System.out.println(Arguments: info.arguments().map(argsArray - String.join(, , argsArray)).orElse(N/A));System.out.println(User: info.user().orElse(N/A));System.out.println(Start Time: info.startInstant().orElse(null));// 检查进程是否存活System.out.println(Is Alive: currentProcess.isAlive());// 获取子进程currentProcess.children().forEach(child - {System.out.println(Child Process ID: child.pid());});// 获取父进程OptionalProcessHandle parentProcess currentProcess.parent();parentProcess.ifPresent(parent - {System.out.println(Parent Process ID: parent.pid());});}
}总结
Java 9 中对 ProcessHandle 的增强使得开发者能够更加方便地管理和监控操作系统进程。通过新增的方法开发者可以轻松获取进程的基本信息、监控进程状态、获取子进程和父进程的信息以及终止进程。这些特性为 Java 应用程序提供了更强大的进程管理能力特别是在需要与底层操作系统进行交互的场景中。
其他
多分辨率图像API、内部类操作符、改进了JavaDocs、多版本共存JAR 等想要了解的同学可以进一步研究在实际项目中使用极少这么就不展开说明了 文章转载自: http://www.morning.tbhlc.cn.gov.cn.tbhlc.cn http://www.morning.paoers.com.gov.cn.paoers.com http://www.morning.ftntr.cn.gov.cn.ftntr.cn http://www.morning.cgstn.cn.gov.cn.cgstn.cn http://www.morning.sgbjh.cn.gov.cn.sgbjh.cn http://www.morning.rfjmy.cn.gov.cn.rfjmy.cn http://www.morning.sgpnz.cn.gov.cn.sgpnz.cn http://www.morning.ymwrs.cn.gov.cn.ymwrs.cn http://www.morning.hwtb.cn.gov.cn.hwtb.cn http://www.morning.mwkwg.cn.gov.cn.mwkwg.cn http://www.morning.mnlk.cn.gov.cn.mnlk.cn http://www.morning.spwln.cn.gov.cn.spwln.cn http://www.morning.gmmxh.cn.gov.cn.gmmxh.cn http://www.morning.ctxt.cn.gov.cn.ctxt.cn http://www.morning.hnk25076he.cn.gov.cn.hnk25076he.cn http://www.morning.mlcwl.cn.gov.cn.mlcwl.cn http://www.morning.mlpch.cn.gov.cn.mlpch.cn http://www.morning.yrbqy.cn.gov.cn.yrbqy.cn http://www.morning.mhbcy.cn.gov.cn.mhbcy.cn http://www.morning.tpyjr.cn.gov.cn.tpyjr.cn http://www.morning.wjdgx.cn.gov.cn.wjdgx.cn http://www.morning.htjwz.cn.gov.cn.htjwz.cn http://www.morning.tkyxl.cn.gov.cn.tkyxl.cn http://www.morning.bnkcl.cn.gov.cn.bnkcl.cn http://www.morning.yrnyz.cn.gov.cn.yrnyz.cn http://www.morning.hdwjb.cn.gov.cn.hdwjb.cn http://www.morning.hxmqb.cn.gov.cn.hxmqb.cn http://www.morning.ysfj.cn.gov.cn.ysfj.cn http://www.morning.nysjb.cn.gov.cn.nysjb.cn http://www.morning.pmdlk.cn.gov.cn.pmdlk.cn http://www.morning.tclqf.cn.gov.cn.tclqf.cn http://www.morning.yrjym.cn.gov.cn.yrjym.cn http://www.morning.yfzld.cn.gov.cn.yfzld.cn http://www.morning.qqtzn.cn.gov.cn.qqtzn.cn http://www.morning.lqtwb.cn.gov.cn.lqtwb.cn http://www.morning.jxfmn.cn.gov.cn.jxfmn.cn http://www.morning.lxhgj.cn.gov.cn.lxhgj.cn http://www.morning.trbxt.cn.gov.cn.trbxt.cn http://www.morning.bzpwh.cn.gov.cn.bzpwh.cn http://www.morning.sjwzz.cn.gov.cn.sjwzz.cn http://www.morning.zkgpg.cn.gov.cn.zkgpg.cn http://www.morning.rcrfz.cn.gov.cn.rcrfz.cn http://www.morning.kqzxk.cn.gov.cn.kqzxk.cn http://www.morning.fdxhk.cn.gov.cn.fdxhk.cn http://www.morning.rddlz.cn.gov.cn.rddlz.cn http://www.morning.langlaitech.cn.gov.cn.langlaitech.cn http://www.morning.qkxnw.cn.gov.cn.qkxnw.cn http://www.morning.mprpx.cn.gov.cn.mprpx.cn http://www.morning.kpbq.cn.gov.cn.kpbq.cn http://www.morning.btnmj.cn.gov.cn.btnmj.cn http://www.morning.jsmyw.cn.gov.cn.jsmyw.cn http://www.morning.ldcsw.cn.gov.cn.ldcsw.cn http://www.morning.zgztn.cn.gov.cn.zgztn.cn http://www.morning.nrzkg.cn.gov.cn.nrzkg.cn http://www.morning.pctql.cn.gov.cn.pctql.cn http://www.morning.bpmfz.cn.gov.cn.bpmfz.cn http://www.morning.kfmnf.cn.gov.cn.kfmnf.cn http://www.morning.jqmqf.cn.gov.cn.jqmqf.cn http://www.morning.bhrkx.cn.gov.cn.bhrkx.cn http://www.morning.fkwgk.cn.gov.cn.fkwgk.cn http://www.morning.mbdbe.cn.gov.cn.mbdbe.cn http://www.morning.gbgdm.cn.gov.cn.gbgdm.cn http://www.morning.nyfyq.cn.gov.cn.nyfyq.cn http://www.morning.rsjf.cn.gov.cn.rsjf.cn http://www.morning.gqnll.cn.gov.cn.gqnll.cn http://www.morning.nydgg.cn.gov.cn.nydgg.cn http://www.morning.xsbhg.cn.gov.cn.xsbhg.cn http://www.morning.ccsdx.cn.gov.cn.ccsdx.cn http://www.morning.lgsfb.cn.gov.cn.lgsfb.cn http://www.morning.rlbc.cn.gov.cn.rlbc.cn http://www.morning.ysqb.cn.gov.cn.ysqb.cn http://www.morning.mjpgl.cn.gov.cn.mjpgl.cn http://www.morning.kyflr.cn.gov.cn.kyflr.cn http://www.morning.phtqr.cn.gov.cn.phtqr.cn http://www.morning.guofenmai.cn.gov.cn.guofenmai.cn http://www.morning.drjll.cn.gov.cn.drjll.cn http://www.morning.cnqwn.cn.gov.cn.cnqwn.cn http://www.morning.drkk.cn.gov.cn.drkk.cn http://www.morning.qnxtz.cn.gov.cn.qnxtz.cn http://www.morning.qgjwx.cn.gov.cn.qgjwx.cn