java8 异步api、循环、日期
2019-08-16 09:42:50来源:博客园 阅读 ()
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,本次分享就到这里,如有谬误恳请指正~
原文链接:https://www.cnblogs.com/funnyzpc/p/10801470.html
如有疑问请与原作者联系
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
上一篇:CPU使用率原理及计算方式
下一篇:Zookeeper的安装
- 学习Java 8 Stream Api (4) - Stream 终端操作之 collect 2020-06-11
- Spring WebFlux 学习笔记 - (一) 前传:学习Java 8 Stream Ap 2020-06-11
- java8 stream的分组功能,具体时候是真的好用 2020-06-10
- 架构设计 | 异步处理流程,多种实现模式详解 2020-06-04
- Kotlin与java8的SAM转换对比 2020-06-03
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash