java8新特性 - HDL语言及源代码 -
default拓展方法
java8为接口声明添加非抽象方法的实现,也成为拓展方法。
public interface Formula {
void doSomething();
default void before() {
System.out.println(“我是拓展方法”);
}
}
public class FormulaService implements Formula {
@Override
public void doSomething() {
before();
System.out.println(“我是override方法”);
}
}
Lambda表达式
java8引入函数式编程,Lambda则是函数式编程的基础。
List《String》 list = Arrays.asList(“a”, “b”, “c”);
// java8之前
CollecTIons.sort(list, new Comparator《String》(){
@Override
public int compare(String o1, String o2) {
return o1.compareTo(o2);
}
});
// lambda
CollecTIons.sort(list, (String o1, String o2) -》 {
return o2.compareTo(o1);
});
// 简洁lambda
CollecTIons.sort(list, (String o1, String o2) -》 o2.compareTo(o1));
// 更简洁lambda
CollecTIons.sort(list, (o1, o2) -》 o2.compareTo(o1));
函数式接口
一个函数式接口有且只能有一个抽象方法申明,其中该注意的是 @FunctionalInterface 注解,此时如果在接口中定义了第二个抽象方法,编译器将会抛出异常。当然如果不加该注解也不是不行,如果接口中有多个抽象方法,而你又使用了lambda表达式,则在调用处会抛出异常。
@FunctionalInterface
public interface Formula《F,T》{
T convert(F var1);
}
Formula《String,Integer》 function = (var1 -》 Integer.valueOf(var1));
Integer var2 = function.convert(“1000”);
方法和构造函数引用
方法引用的标准语法是 类名:方法名类型示例
引用静态方法
Formula《String,Integer》 function = (Integer::valueOf);
Integer var2 = function.convert(“1000”);
引用某个类型的任意对象的实例方法
public static void main(String[] args) {
String[] array = {“贱明”, “学友”};
Arrays.sort(array, String::compareTo);
}
引用构造方法
// 定义工厂
interface PersonFactory《P extends Person》{
P create(String name);
}
// Person类的构造方法
public Person(String name) {
this.name = name;
}
// 创建
PersonFactory《Person》 factory = Person::new;
factory.create(“贱明”);
查看评论 回复