JDK1.8新特性
接口默认方法
-
接口里可以有实现的方法,方法default(真正要写出来的)关键字
-
接口里可以有实现的静态方法,在方法前面加static关键字
package com.hqyj; public interface Interface8 { //接口里面的方法如果添加default关键字,这个方法可以在接口里实现 //一个接口里面可以有多个default方法 //加了default关键字,该方法就要必须实现 default void showName() { System.out.println("JDK1.8的默认接口方法"); } default void showName1() { System.out.println("JDK1.8的默认接口方法1"); } //接口如果加上了static关键字,该方法也必须要实现 //一个接口里面可以有多个静态的实现方法 static void methodStatic() { System.out.println("jdk1.8的接口可以用静态实现的方法"); } static void methodStatic1() { System.out.println("jdk1.8的接口可以用静态实现的方法1"); } }
函数式接口
接口只有一个抽象方法,可以有其它实现的方法
函数式接口一般在接口名称上添加一个注解@FunctionalInterface,添加注解后,会校验接口里是否只有一个抽象方法
函数式接口跟@FunctionalInterface没有必然的关系,只要符合第一条要求,不加注解也是函数式接口、
作用:在实现的时候可以用朗姆达lambda表达式(箭头函数)
package com.hqyj;
@FunctionalInterface //添加注解后,就会强制语法检查接口是否只有一个抽象方法
public interface MyFuncInterface {
//一个接口如果只有一个抽象方法,这个接口就是函数式的接口
//只要满足只有一个接口方法,即便不加注解@FunctionalInterface它也是函数式接口,注解的目的只是限制的作用
int sum(int a,int b);
default void fun1(){
}
static void fun2(){
}
}
朗姆达表达式lambda
方法的简化写法,比如下面的方法:
int sum(int a,int b){
return a+b;
}
lambda表达式:
(a , b)-> (a + b)
lambda表达式例子:
package com.hqyj;
public class LambdaDemo {
public static void main(String[] args) {
// 方法体只有一行代码,不用大括号,也不要分号,参数不需要写类型
// () -> 5 //无参方法,返回5,方法体只有代码,运行代码结果自动作为返回值,没有参数要写小括号
// x-> 2*x //一个参数x,返回2*x,一个参数可以不写小括号
// (x-y) -> x-y //两个参数x和y,返回结果式x-y
// () -> {多行代码} //方法体有多行代码需要大括号
}
}
lambda表达式和函数式接口配合使用
-
定义函数式接口
package com.hqyj; @FunctionalInterface public interface MathOpreation { int opt(int a,int b); }
-
用lambda表达式实现接口并创建对象,调用接口方法
package com.hqyj; public class MathOpreationTest { public static void main(String[] args) { //加法 MathOpreation add = (a,b) -> a + b; //减法 MathOpreation sub = (a,b) -> a - b; //乘法 MathOpreation multi = (a,b) -> a * b; //除法 MathOpreation div = (a,b) -> a / b; //加法实现类的方法 int i = add.opt(3,2); System.out.println(i); //调用减法实现类的方法 i = sub.opt(3, 2); System.out.println(i); //调用乘法的实现类 i = multi.opt(3, 2); System.out.println(i); //调用除法的实现类 i = div.opt(3, 2); System.out.println(i); } }
JDK的类中,只要某个方法的类型是函数式接口,调用该方法时候就可以用lambda表达式
package com.hqyj;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class ListLambda {
public static void main(String[] args) {
List<Integer> ints = new ArrayList<>();
ints.add(1);
ints.add(3);
ints.add(5);
ints.add(7);
//romoveIf()方法可以使用lambda表达式,返回真元素背删除
ints.removeIf(item -> item <= 2);
System.out.println(ints);
List<Integer> list = Arrays.asList(1, 3, 5, 7, 8, 4);
//遍历list,可以用lambda表达式处理遍历出来的每个元素
list.forEach(item -> {
if (item % 2 ==0){
System.out.println(item);
}
});
}
}
Stream
集合类型都有stream方法,产生一个数据流,可以对数据流做处理:forEach,map,filter,limt,sorted,collect
package com.hqyj;
import java.util.Arrays;
import java.util.List;
import java.util.Random;
import java.util.stream.Collectors;
public class StreamDemo {
public static void main(String[] args) {
List<String> listStr = Arrays.asList("abc","","bc","efg","abcd","","jkl");
//filter()过滤掉不要的内容,lambda表达式返回false会被过滤,返回true保留
//collect()把数据流重写生成一个集合,参数Collectors.toList()表示重新生成list集合并返回
//不影响原来列表的内容
List<String> listNew = listStr.stream().filter(str -> !str.isEmpty()).collect(Collectors.toList());
System.out.println(listNew);
System.out.println(listStr);
//map 映射
List<Integer> listInt = Arrays.asList(10,1,2,3,4,5,6);
//返回一个列表,元素是listInt每个元素的平方
List<Integer> list = listInt.stream().map(item -> item * item).collect(Collectors.toList());
System.out.println(list);
//limit 限制数量
Random random = new Random();
//ints()随机产生整数流,limit限制随机数个数
random.ints().limit(10).forEach(item -> System.out.println(item));
//sorted()
listInt.stream().sorted().forEach(item -> System.out.println(item));
//collect
//数据流拼接为字符串
String s = listStr.stream().collect(Collectors.joining(","));
System.out.println(s);
}
}
方法引用
对象::方法
//方法引用
//用小括号里面指定的方法来处理foreach出来的每个元素
listInt.forEach(System.out::println);
Optional
为了解决返回值为null的一个类
使用时先用
package com.hqyj;
import java.util.Optional;
public class OptionalDemo {
public static void main(String[] args) {
Optional<Integer> sum = sum(null,3);
//如果Optional里面有值,isPresent()返回true,没有值返回false
if (sum.isPresent()) {
System.out.println(sum.get());//get()从Optional里面取值
}else {
System.out.println("没有返回值");
}
}
private static Optional<Integer> sum(Integer a, Integer b){
if (a == null || b == null){
//empty()方法没有给Optional赋值
return Optional.empty();
}else {
//of()把值封装到Optional里,使用的时候可用get()方法取值
return Optional.of(a + b);
}
}
}
日期时间类
LocalDate 只含年月日
LocalDateTime 包含年月日时分秒
package com.hqyj;
import java.time.*;
import java.time.format.DateTimeFormatter;
public class LocalDateDemo {
public static void main(String[] args) {
//创建当前时间的日期时间对象
LocalDateTime now = LocalDateTime.now();
System.out.println(now);//2022-08-10T14:30:22.119
//返回日期对象
LocalDate localDate = now.toLocalDate();
System.out.println(localDate);//2022-08-10
//返回时间对象
LocalTime localTime = now.toLocalTime();
System.out.println(localTime);//14:30:22.119
//返回月份
int monthValue = now.getMonthValue();
System.out.println(monthValue);
//返回年份
int year = now.getYear();
System.out.println(year);
//返回一年中的第几天
int dayOfYear = now.getDayOfYear();
System.out.println(dayOfYear);
//返回几号
int dayOfMonth = now.getDayOfMonth();
System.out.println(dayOfMonth);
//返回星期几
int value = now.getDayOfWeek().getValue();
System.out.println(value);
//返回小时(几点,二十四小时制)
int hour = now.getHour();
System.out.println(hour);
//返回分钟
int minute = now.getMinute();
System.out.println(minute);
//返回秒
int second = now.getSecond();
System.out.println(second);
//格式化日期
String format = now.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
System.out.println(format);
/*日期运算的方法*/
//40天以后的日期
LocalDateTime localDateTime = now.plusDays(30);
System.out.println(localDateTime);
//加负数,得到以前的日期 30天以前的日期
LocalDateTime localDateTime1 = now.plusDays(-30);
System.out.println(localDateTime1);
}
}