JAVA8新特性总结
一、(转)Java8中Stream详细用法大全
二、JAVA8函数式编程应用
三、其他特性(日期、Optional、接口方法)
1、LocalDateTime用法
import java.time.Duration;
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
public class TimeTest {
/**
* 一、日期创建:
* LocalDate localDate = LocalDate.now();
* LocalTime localTime = LocalTime.now();
* LocalDateTime localDateTime = LocalDateTime.now();
*
* LocalDate localDate = LocalDate.of(2016, 10, 26);
* LocalTime localTime = LocalTime.of(02, 22, 56);
* LocalDateTime localDateTime =
* LocalDateTime.of(2016, 10, 26, 12, 10, 55);
*
* 二、日期加减运算
* plusDays, plusWeeks, plusMonths, plusYears
* minusDays, minusWeeks, minusMonths, minusYears
* plus, minus
*
* 三、日期比较计算
* isBefore, isAfter
*
* 四、是否闰年
* isLeapYear
*
* 五、时间戳与时间间隔运算
* Instant 时间戳:以Unix元年(传统的设定为UTC时区1970年1月1日午夜时分)开始所经历的描述进行运算
* Duration:用于计算两个“时间”间隔
* Period:用于计算两个“日期”间隔
*
* 六、获取时间详细
*
*
* 七、日期解析和格式化
* java.time.format.DateTimeFormatter类
*/
public static void main(String[] args) {
/**
* 日期加减运算
*/
LocalDateTime localDateTime = LocalDateTime.of(2019, Month.SEPTEMBER, 10, 14, 46, 56);
//增加一年
localDateTime = localDateTime.plusYears(1); //结果: 2020-09-10 14:46:56
localDateTime = localDateTime.plus(1, ChronoUnit.YEARS); //结果: 2021-09-10 14:46:56
//减少一个月
localDateTime = localDateTime.minusMonths(1); //结果: 2021-08-10 14:46:56
localDateTime = localDateTime.minus(1, ChronoUnit.MONTHS); //结果: 2021-07-10 14:46:56
// 设置日期
LocalDate localDate = LocalDate.of(2019, 9, 10);
// 设置时间
LocalTime localTime = LocalTime.of(13, 51, 10);
/**
* 获取时间详细
*/
// 获取年
int year = localDate.getYear(); //结果:2019
int year1 = localDate.get(ChronoField.YEAR); //结果:2019
// 获取月
Month month = localDate.getMonth(); // 结果:SEPTEMBER
int month1 = localDate.get(ChronoField.MONTH_OF_YEAR); //结果:9
// 获取日
int day = localDate.getDayOfMonth(); //结果:10
int day1 = localDate.get(ChronoField.DAY_OF_MONTH); // 结果:10
// 获取星期
DayOfWeek dayOfWeek = localDate.getDayOfWeek(); //结果:TUESDAY
int dayOfWeek1 = localDate.get(ChronoField.DAY_OF_WEEK); //结果:2
//获取小时
int hour = localTime.getHour(); // 结果:13
int hour1 = localTime.get(ChronoField.HOUR_OF_DAY); // 结果:13
//获取分
int minute = localTime.getMinute(); // 结果:51
int minute1 = localTime.get(ChronoField.MINUTE_OF_HOUR); // 结果:51
//获取秒
int second = localTime.getSecond(); // 结果:10
int second1 = localTime.get(ChronoField.SECOND_OF_MINUTE); // 结果:10
/**
* 计算时间间隔
*/
Instant in1 = Instant.now();
Instant in2 = Instant.now();
System.out.println(Duration.between(in1, in2).toMillis());
/**
* 日期格式化
*/
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
LocalDateTime time1 = LocalDateTime.now();
String formatDateTime = time1.format(formatter);
/**
* 日期解析
*/
LocalDateTime dateTime = LocalDateTime.parse(formatDateTime, formatter);
}
}
2、Date与LocalDateTime转换
/**
* LocalDateTime转毫秒时间戳
* @param localDateTime LocalDateTime
* @return 时间戳
*/
public static Long localDateTimeToTimestamp(LocalDateTime localDateTime) {
try {
ZoneId zoneId = ZoneId.systemDefault();
Instant instant = localDateTime.atZone(zoneId).toInstant();
return instant.toEpochMilli();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* 时间戳转LocalDateTime
* @param timestamp 时间戳
* @return LocalDateTime
*/
public static LocalDateTime timestampToLocalDateTime(long timestamp) {
try {
Instant instant = Instant.ofEpochMilli(timestamp);
ZoneId zone = ZoneId.systemDefault();
return LocalDateTime.ofInstant(instant, zone);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* Date转LocalDateTime
* @param date Date
* @return LocalDateTime
*/
public static LocalDateTime dateToLocalDateTime(Date date) {
try {
Instant instant = date.toInstant();
ZoneId zoneId = ZoneId.systemDefault();
return instant.atZone(zoneId).toLocalDateTime();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* LocalDateTime转Date
* @param localDateTime LocalDateTime
* @return Date
*/
public static Date localDateTimeToDate(LocalDateTime localDateTime) {
try {
ZoneId zoneId = ZoneId.systemDefault();
ZonedDateTime zdt = localDateTime.atZone(zoneId);
return Date.from(zdt.toInstant());
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
3、SpringBoot中应用LocalDateTime
将LocalDateTime字段以时间戳的方式返回给前端 添加日期转化类。并在LocalDateTime字段上添加@JsonSerialize(using = LocalDateTimeConverter.class)注解,如下:
public class LocalDateTimeConverter extends JsonSerializer<LocalDateTime> {
@Override
public void serialize(LocalDateTime value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
gen.writeNumber(value.toInstant(ZoneOffset.of("+8")).toEpochMilli());
}
}
@JsonSerialize(using = LocalDateTimeConverter.class)
protected LocalDateTime gmtModified;
3.1 后端返给前端日期格式
@JsonFormat(shape=JsonFormat.Shape.STRING, pattern="yyyy-MM-dd HH:mm:ss")
protected LocalDateTime gmtModified;
3.2 前端传给后端日期格式化
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
protected LocalDateTime gmtModified;
4、Optional操作可有效避免NPE问题
orElse与orElseGet的区别在于orElseGet不创建空对象,节省内存
@Test
public void givenPresentValue_whenCompare_thenOk() {
User user = new User("john@gmail.com", "1234");
logger.info("Using orElse");
User result = Optional.ofNullable(user).orElse(createNewUser());
logger.info("Using orElseGet");
User result2 = Optional.ofNullable(user).orElseGet(() -> createNewUser());
}
输出:
Using orElse
Creating New User
Using orElseGet
这个示例中,两个 Optional 对象都包含非空值,两个方法都会返回对应的非空值。不过,orElse() 方法仍然创建了 User 对象。与之相反,orElseGet() 方法不创建 User 对象。
在执行较密集的调用时,比如调用 Web 服务或数据查询,这个差异会对性能产生重大影响。
4.1 Optional使用场景:
4.1.1 转换值
String email = Optional.ofNullable(user)
.map(u -> u.getEmail()).orElse("default@gmail.com");
4.1.2 流操作
Optional<User> result = Optional.ofNullable(user)
.filter(u -> u.getEmail() != null && u.getEmail().contains("@"));
assertTrue(result.isPresent());
4.1.3 为null直接抛出异常
User result = Optional.ofNullable(user)
.orElseThrow( () -> new IllegalArgumentException());
5、接口方法
5.1 接口种新增可定义静态方法与默认方法
5 public class InterfaceTest {
6 public static void main(String[] args) {
7 MyImpl myClass = new MyImpl();
8 System.out.println(myClass.getName());
9 System.out.println(MyInterface.getAge());
10 }
11 }
12
13 interface MyInterface {
14 default String getName(){
15 return "nana";
16 }
17
18 static Integer getAge(){
19 return 18;
20 }
21 }
22
23 /**
24 * 若一个接口中定义了一个默认方法,而另外一个父类中又定义了一个同名的方法时,取父类
25 * 若一个接口中定义了一个默认方法,而另外一个实现接口中又定义了一个同名的方法时,实现类需要执行重写其中一个
26 */
27 class MyImpl implements MyInterface {
28 }