java8新特性
java8新特性
一、java8有哪些新特性
lambda表达式
函数式接口
默认方法 (接口中定义default方法)
方法引用
接口中的默认方法出现的好处?
不用修改实现类的情况下, 功能的增强
Java8的明显特点是通过默认接口定义、Lambda表达式、方法引用、函数式接口带来了函数式编程
1.java8中的接口现在支持声明方法的同时提供实现,通过两种方式可以完成
(1)接口内声明静态方法
调用通过接口名.方法名
(2)接口内声明默认方法
默认方法可以被重写
调用通过接口名.super.方法名
2.函数式编程
以函数思维做为核心,在这种思维的角度去思考问题,最重要的基础是函数的输入和输出
使用不可变值和函数,【函数对一个值进行处理,映射成另一个值】
3.函数式接口
只定义【一个抽象方法】的接口
只能有一个抽象方法
可以有静态方法和默认方法,因为这两种方法都是已经实现的了
可以包含Object里所有能重写的方法,因为即使接口包含像String toString()这样的抽象方法,它的实现类也会因继承了Object类,而再次对接口中的toString()方法进行实现。
注:哪怕有很多默认方法,只要接口只定义了一个抽象方法,它就仍然是一个函数式接口。
(1)函数式接口的作用
方便直接用Lambda表达式构造出实例,让代码更加简洁
Lambda表达式允许你直接以内联的形式为函数式接口的抽象方法提供实现,并把整个表达式作为函数式接口的实例。
你用匿名内部类也可以完成同样的事情,只不过比较笨拙。
Comparator<String> c = new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
return o2.length()-o1.length();
}
};
//函数式编程 : 参数+返回值
Comparator<String> d = (o1,o2)->o2.length()-o1.length();
(2) 函数描述符
函数式接口中的抽象方法的名基本上就是Lambda表达式的名,我们将这种抽象方法叫作函数描述符。
() -> {}
参数列表可以写类型 可以不写类型
(3)声明函数式接口 @FunctionalInterface
这个标注用于表示该接口会设计成一个函数式接口
4.lambda表达式
它没有名称,但它有参数列表、函数主体、返回类型,可能还有一个可以抛出的异常列表。
(参数列表)->{return 返回值}
lambda中变量的问题:
lambda中可以使用成员变量,局部变量,但是使用过局部变量以后,该局部变量就必须为final,所以不能再修改了。
(1)不需要声明参数类型,编译器可以统一识别参数值。
(2)一个参数无需定义圆括号,但多个参数需要定义圆括号。
(3)lambda 表达式的局部变量可以不用声明为 final,但是必须不可被后面的代码修改
(4)在lambda表达式不允许声明与全局变量相同的局部变量、参数。
5.四大函数式接口
消费型接口 Consumer<T> void accept(T t);
供给型接口 Supplier<T> T get();
函数型接口 Function<T> R apply(T t);
断定型接口 Predicate<T> boolean test(T t);
Predicate<T>:断言型接口
//接收一个对象,返回boolean型结果。
//将满足条件的字符串 ,放入集合中去
boolean test(T t);
public class LambdaTest4 {
public static void filter(List<String> languages, Predicate<String> condition) {
for(String name: languages) {
if(condition.test(name)) {
System.out.println(name + " ");
}
}
}
public static void main(String[] args) {
List<String> languages = Arrays.asList("Java", "html5","JavaScript", "C++", "hibernate", "PHP");
//开头是J的语言
filter(languages,(String name)->name.startsWith("J"));
//5结尾的
filter(languages,(String name)->name.endsWith("5"));
//所有的语言
filter(languages,(name)->true);
//一个都不显示
filter(languages,(name)->false);
//显示名字长度大于4
filter(languages,(name)->name.length()>4);
System.out.println("-----------------------");
//名字以J开头并且长度大于4的
Predicate<String> c1 = (name)->name.startsWith("J");
Predicate<String> c2 = (name)->name.length()>4;
filter(languages,c1.and(c2));
}
Function<T,R>:函数型接口
R apply(T t); 有参数有返回值
//表示接收一个参数并产生结果的函数
Consumer<T>:消费型接口
void accept(T t);有参数没有返回值
Supplier<T>:供给型接口
T get();没参数有返回值
4.java常用的函数式编程接口
1.比较器
2.实现线程
3.绑定事件
4.集合数据排序
比较苹果的重量
// 3、使用Lambda表达式
inventory.sort((a, b) -> a.getWeight() - b.getWeight());
// 4、使用Comparator的comparing
Comparator<Apple> comparing =Comparator.comparing((Apple a) -> a.getWeight());
inventory.sort(Comparator.comparing((Apple a) -> a.getWeight()));
//或者等价于
inventory.sort(Comparator.comparing(Apple::getWeight));
public class Test { public static void main(String[] args) { ArrayList<Apple> list = new ArrayList<>(); list.add(new Apple(26,"gala")); list.add(new Apple(52,"luo")); list.add(new Apple(22,"s")); list.add(new Apple(33,"cheng")); Comparator<Apple> comparing = Comparator.comparing((Apple apple) -> apple.getName().length()); list.sort(comparing); System.out.println(list); }