JDK1.8的新特性
1.lambda表达式
2.新日期LocalDateTime.now()
3.接口中可以定义默认方法和static方法
4.:: -- 方法引用
1.Lambda表达式
作用:
1.实现功能性接口(函数式接口)
2.对集合进行遍历
语法:()->{}
用法1:实现功能/函数式接口
功能性/函数式接口:接口中只有一个抽象方法,
且接口上方有注解@FunctionalInterface
lambda表达式各部分的意义
():重写方法的参数列表
{}:重写方法的方法体
lambda表达式各个部分的简化:
():
1.参数列表中的数据类型都可以省略
2.若参数列表中只有一个参数,此时()可以省略;
若参数列表无参或者有多个参数,此时()都不可以省略
{}:
1.若体部分只有一行代码,此时{}可以省略
2.若体部分只有一行代码,且有return,此时return也可以省略
-练习:创建一个集合,保存若干个学生对象,要求集合中的元素按照年龄降序排列并输出(使用lambda表达式)
public static void main(String[] args) {
List<Stu> list=new ArrayList<>();
Stu stu1=new Stu(3,"tom",23);
Stu stu2=new Stu(2,"amy",56);
Stu stu3=new Stu(4,"alp",34);
Stu stu4=new Stu(5,"iop",14);
list.add(stu1);
list.add(stu2);
list.add(stu3);
list.add(stu4);
Collections.sort(list,(o1,o2)->o2.getAge().compareTo(o1.getAge()));
for (Stu stu : list) {
System.out.println(stu);
}
}
用法2:对集合进行遍历
集合若想使用lambda表达式遍历,需要集合对lambda的支持
支持是指:看集合是否提供forEach(),若有,则可以使用lambda对集合进行遍历
- list.forEach(str->System.out.println(str));
- set.foreach(str->System.out.println(str));
- map.foreach((k,v)->System.out.println(k+"-"+v));
2.接口中可以定义默认方法和static方法
JDK1.8之前,接口中有的成员:2种
- 常量 接口为其提供了默认的修饰符
public static final
- 抽象方法 接口为其提供了默认的修饰符
public abstract
从JDK1.8开始,允许接口中定义默认方法和static方法
默认方法需要添加修饰符default
1.定义默认方法:eg:default void demo()
2.调用默认方法:通过接口的实现类对象来调用方法
3.注意点:若一个实现类实现了2个接口,而2给接口中有相同的默认方法,此时在实现类中必须对该方法进行重写,否则编译不通过。
接口中定义static方法:和平时的static方法定义是相同的
调用:通过接口名调用static方法即可
3.:: -方法引用
::是用于简化lambda表达式的,不做其他
简化的前提:lambda表达式中的参数会作为参数传递给体中调用的方法,且是所有参数都传递给调用的方法。此时就可以使用::来简化lambda表达式
(a,b,c)->{A.test(a,b,c)}
此时可以使用::简写
(a,b,c)->{A::test}
1.static方法引用 -- 场景:求绝对值
1.定义功能性接口
2.出现接口作为参数出现
3.使用::简写lambda表达式
2.实例方法引用 -- 将所有字母转换为大写
@FunctionalInterface
public interface StringUtils {
String toUpper(String str);
}
public class StringUtilsTest {
public String getUpper(String str) {
return str.toUpperCase();
}
public static String toUpperCase(String str, StringUtils utils) {
return utils.toUpper(str);
}
public static void main(String[] args) {
StringUtilsTest test = new StringUtilsTest();
// String s = toUpperCase("hello", str -> test.getUpper(str));
// 使用::简化
String s = toUpperCase("hello", test::getUpper);
System.out.println(s);
}
}
3.构造方法引用 -- 根据name获取学生对象
@FunctionalInterface
public interface StudentInt {
Stu getStuByname(String name);
}
public class StuTest {
public static Stu getStudent(String name,StudentInt studentInt){
return studentInt.getStuByname(name);
}
public static void main(String[] args) {
//Stu stu = getStudent("tom", name -> new Stu(name));
// 使用::简化
Stu stu = getStudent("jack", Stu::new);
System.out.println(stu);
}
}
4.数组的构造方法引用 -- 给出长度获取对应的数组对象
@FunctionalInterface
public interface ArrayUtil {
int[] getArray(int len);
}
public class ArrayTest {
public static int[] getArray(int len,ArrayUtil arrayUtil){
return arrayUtil.getArray(len);
}
public static void main(String[] args) {
//int[] array = getArray(10, len -> new int[len]);
// 使用::简化
int[] array = getArray(5, int[]::new);
System.out.println(Arrays.toString(array));
}
}