java8 异步api、循环、日期
java8 异步api、循环、日期
转载请注明出处:https://www.cnblogs.com/funnyzpc/p/10801470.html
异步api
对于多任务耗时的业务场景,一般我们会用到线程异步处理,在以前我们用 Thread 或者 Runnable 来实现异步,这是oracle官方做法,不过缺点很明显
- 对于复杂业务场景需要配置线程池
- 代码繁杂,对于新手容易造成不必要的bug
- 如果涉及到线程锁或线程通讯就棘手了
现在,java8为我们提供了CompletableFuture类,可以完全解决以上问题。
主要方法有:
runAsync()异步无参返回- 样例:
@Test
public void asyncThread()throws Exception{
CompletableFuture async1 = CompletableFuture.runAsync(()->{
try {
Thread.sleep(1000);
System.out.println(Thread.currentThread().getName());
System.out.println("none return Async");
}catch (Exception e){
e.printStackTrace();
}
});
// 调用get()将等待异步逻辑处理完成
async1.get();
}
supplyAsync()异步有参返回- 样例:
@Test
public void asyncThread2()throws Exception{
CompletableFuture<String> async2 = CompletableFuture.supplyAsync(()->{
return "hello";
});
String result = async2.get();
// String result2 = async2.get(5L, TimeUnit.SECONDS);
System.out.println(result);
}
allOf()多个异步处理(针对有参返回)- 样例:
@Test
public void asyncThread3()throws Exception{
CompletableFuture<String> a = CompletableFuture.supplyAsync(() -> "hello");
CompletableFuture<String> b = CompletableFuture.supplyAsync(() -> "youth");
CompletableFuture<String> c = CompletableFuture.supplyAsync(() -> "!");
CompletableFuture all = CompletableFuture.allOf(a,b,c);
all.get();
String result = Stream.of(a, b,c)
.map(CompletableFuture::join)
.collect(Collectors.joining(" "));
System.out.println(result);
}
anyOf()多个异步随机处理(针对有参返回)- 样例
@Test
public void asyncThread4()throws Exception{
CompletableFuture<String> a = CompletableFuture.supplyAsync(() ->{
try{
Thread.sleep(20);
return "hello";
}catch (Exception e){
e.printStackTrace();
return "none~";
}
});
CompletableFuture<String> b = CompletableFuture.supplyAsync(() -> "youth");
CompletableFuture<String> c = CompletableFuture.supplyAsync(() -> "!");
CompletableFuture<Object> any = CompletableFuture.anyOf(a,b,c);
String result = (String)any.get();
System.out.println(result);
}
循环ForEach
java8 在原有for或iterator循环下又提供了 forEach 的方法,不过与for循环不同的是 forEach 循环是建立在stream之上的,而且比for或iterator方便的是,他可以循环Map对象,
如果您尝试配合filter处理就更赞了~
- forEach对List的循环样例
@Test
public void listForeach(){
List<String> lst = new ArrayList<String>(5){{
add("A");
add("B");
add("H");
add("O");
add("M");
}};
lst.forEach(System.out::println);
lst.forEach((item)-> System.out.println(item.concat("_")));
}
- forEach对数组的循环 样例
@Test
public void arrForeach(){
String[] strArr = new String[]{"A","B","C","D"};
Arrays.stream(strArr).forEach(System.out::println);
}
- forEach对int范围的循环 样例
@Test
public void numericForeach(){
IntStream.range(0,10).forEach(System.out::println);
}
- forEach对Map的循环 样例:
@Test
public void mapForeach(){
Map<String,Object> mps = new HashMap<String,Object>(5){{
put("a",1);
put("b",true);
put("c",23.44F);
put("d","hello");
put("e",11L);
}};
mps.forEach((k,v)-> System.out.println(k.concat(":").concat(String.valueOf(v))));
String str = "hello";
}
新的时间类(LocalDate、LocalDateTime)
java8 之前我们处理时间 大多会涉及到这几个类Date、SimpleDateFormat、Calendar ,这种处理方式复杂、存在线程隐患、国际化困难、日期加减等处理麻烦等等。
现在有了 LocalDate、LocalDateTime、DateTimeFormatter 生活就变得简单了~
- 格式化及区域定义
/**设置格式化模板**/
private static final DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSSS");
/**设置日期时区常量**/
public static final ZoneId CHINA_ZONE_ID = ZoneId.systemDefault();
- Date格式化为DateTime
/**Date格式化为DateTime**/
@Test
public void dateToDateTime(){
Date date = new Date();
LocalDateTime dateTime = date.toInstant().atZone(CHINA_ZONE_ID).toLocalDateTime();
System.out.println(dateTime);
}
- LocalDate/LocalDateTime转Date
/**LocalDate/LocalDateTime转Date**/
@Test
public void toDate(){
// LocalDate
LocalDate localDate = LocalDate.now();
Date d1 = Date.from(localDate.atStartOfDay(CHINA_ZONE_ID).toInstant());
System.out.println(d1);
// LocalDateTime
LocalDateTime localDateTime = LocalDateTime.now();
Date d2 = Date.from(localDateTime.atZone(CHINA_ZONE_ID).toInstant());
System.out.println(d2);
}
- 日期格式化
/**日期格式化**/
@Test
public void formatDate(){
System.out.println(LocalDateTime.now().format(DATE_TIME_FORMATTER));
}
- 日期加减
/**日期加减**/
@Test
public void plusDay(){
LocalDateTime dateTime = LocalDateTime.now(CHINA_ZONE_ID);
//天
dateTime=dateTime.plusDays(1);
//时
dateTime=dateTime.plusHours(-1);
//分钟
dateTime=dateTime.plusMinutes(30);
System.out.println(dateTime.format(DATE_TIME_FORMATTER));
}
- 日期时间间隔
/**日期时间间隔**/
@Test
public void betweenDay(){
// LocalDateTime
LocalDateTime startDate = LocalDateTime.of(2019,07,01,12,12,22);
LocalDateTime endDate = LocalDateTime.of(2019,07,03,12,12,22);
Long withSecond = endDate.atZone(CHINA_ZONE_ID).toEpochSecond() - startDate.atZone(CHINA_ZONE_ID).toEpochSecond();
System.out.println(withSecond/60/60/24);
// LocalDate
LocalDate startDate2 = LocalDate.of(2019,07,01);
LocalDate endDate2 = LocalDate.of(2019,07,03);
Long withSecond2 = endDate2.toEpochDay() - startDate2.toEpochDay();
System.out.println(withSecond2);
}
- 第一天and最后一天
/**第一天and最后一天**/
@Test
public void theLastDay(){
// 当月第一天
LocalDateTime dateTime = LocalDateTime.of(2019,07,03,12,12,22);
dateTime = dateTime.with(TemporalAdjusters.firstDayOfMonth());
System.out.println(dateTime);
// 当月最后一天
dateTime = dateTime.with(TemporalAdjusters.lastDayOfMonth());
System.out.println(dateTime);
//当月的第几天
dateTime = LocalDateTime.now();
int dayOfMonth = dateTime.getDayOfMonth();
System.out.println(dayOfMonth);
// 当前周的第几天
int dayOfWeek = dateTime.getDayOfWeek().getValue();
System.out.println(dayOfWeek);
}
OK,本次分享就到这里,如有谬误恳请指正~
java8 异步api、循环、日期的更多相关文章
- Java8新特性时间日期库DateTime API及示例
Java8新特性的功能已经更新了不少篇幅了,今天重点讲解时间日期库中DateTime相关处理.同样的,如果你现在依旧在项目中使用传统Date.Calendar和SimpleDateFormat等API ...
- Java8 LocalDate操作时间和日期的API
时间项目中的涉及到的时间处理非常多,犹豫SimpleDateFormat的不安全性以及Calendar等类在计算时比较复杂, 往往我们都会使用工具类来封装较多的日期处理函数, 但是JDK8中新增了操作 ...
- 【JDK8】Java8 LocalDate操作时间和日期的API
时间项目中的涉及到的时间处理非常多,犹豫SimpleDateFormat的不安全性以及Calendar等类在计算时比较复杂, 往往我们都会使用工具类来封装较多的日期处理函数, 但是JDK8中新增了操作 ...
- Java8 时间 API
前言 Java8 中最为人津津乐道的新改变恐怕当属函数式 API 的加入.但实际上,Java8 所加入的新功能远不止这个. 本文将基于<Java SE8 for the Really Impat ...
- java8新的时间日期库及使用示例
转自:https://www.cnblogs.com/comeboo/p/5378922.html 来自:Java译站 链接:http://it.deepinmind.com/java/2015/03 ...
- .NET 编写一个可以异步等待循环中任何一个部分的 Awaiter
林德熙 小伙伴希望保存一个文件,并且希望如果出错了也要不断地重试.然而我认为如果一直错误则应该对外抛出异常让调用者知道为什么会一直错误. 这似乎是一个矛盾的要求.然而最终我想到了一个办法:让重试一直进 ...
- Redis源码解析:19Hiredis异步API代码解析
Hiredis中的异步API函数需要与事件库(libevent,libev, ev)一起工作.因为事件循环的机制,异步环境中的命令是自动管道化的.因为命令是异步发送的,因此发送命令时,必要情况下,需要 ...
- Java8 Time API与老Date之间的转换
前面我已经总结了Java8 Time API常用的一些方法.封装的工具类,可是最近需要对一个比较老的项目进行重构,大致看了一下使用的Jdk还是7而且里面的时间工具类还是使用的Date和Calendar ...
- Code First系列之视图,存储过程和异步API
返回<8天掌握EF的Code First开发>总目录 本篇目录 视图View 存储过程 使用存储过程CRUD 异步API 本章小结 自我测试 本系列的源码本人已托管于coding上:点击查 ...
随机推荐
- 在Android手机上学习socket程序
我们都知道Android手机是基于Linux系统的,在没有Linux环境,但是想学习socket编程的同学可以在Android手机中试试,利用ndk编译可执行文件在Android手机中运行.不同于动态 ...
- 1.通过模板创建MAP版本项目
1.选择mpa+ef+module-zero 取名字 2.用vs打开项目后,在解决方案上右键 还原nuget包 3.打开程序包管理器控制台,选择以EntityFramework结尾的项目,并执行upd ...
- 张汝京:CIDM模式进可攻、退可守,建议尝试
飞象网讯(路金娣/文)大约30多年前一些美国.日本和欧洲的IDM半导体工厂把多余的产能出来做代工服务,因为代工的公司不会与客户竞争,所以专业代工的模式成为半导体市场的新宠.那么,究竟国内半导体行业更加 ...
- linux nano 命令
linux nano一linux像pico文本编辑软件,功能少.但是,基本能满足要求
- WebService它Soap头验证进入
1.创建一个新的类.如"AuthHeaderUser",在传承"System.Web.Services.Protocols.SoapHeader"类别 2.新W ...
- HQL链接查询
和SQL查询一样,HQL也支持各种各样的连接查询,如内连接.外连接.我们知道在SQL中可通过join字句实现多表之间的连接查询.HQL同样提供了连接查询机制,还允许显示指定迫切内连接和迫切左外连接.H ...
- postgresql && .net core 使用空间数据
这里主要讲遇到的一些报错 增删改查 && 计算部分基本和sql server的空间数据操作一毛一样,感谢微软大大的倾情支持,直接看demo即可(- ̄▽ ̄)- 前往sql server ...
- mysql常见操作汇总 专题
mysql中in多个字段 1. 基本用法 SELECT * FROM USER WHERE , , ); 2. 多个字段同时使用 SELECT * FROM USER WHERE (, ),(, ), ...
- 【msdn wpf forum翻译】获取当前窗口焦点所在的元素
原文:[msdn wpf forum翻译]获取当前窗口焦点所在的元素 原文地址: http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/6b ...
- thinkphp前台html格式化输出日期
输出格式: {$time|strtotime|date="Y年m月d日",###} 格式说明: $time 是日期字符串,一般后台的时间是"Y-m-d H:i:s&quo ...