Java新特性
Java8
新特性简介
- 速度更快
- 代码更少
- 强大的Stream API
- 便于并行
- 最大化减少空指针异常
- Nashorn引擎,
新特性
- Lambda表达式
- 函数式接口
- 方法引用和构造器引用
- StreamAPI
- Optional类
- 新的日期API
Lambda表达式
Lambda本质:作为函数式接口的实例
使用箭头函数
public void test1(){
Runnable r1 = new Runnable() {
@Override
public void run() {
System.out.println("dddd");
}
};
r1.run();
System.out.println("*****");
//lambda表达式
Runnable r2 = ()->System.out.println("lambda");
r2.run();
Comparator<Integer> com1 = new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return Integer.compare(o1,o2);
}
};
//lambda写法
Comparator<Integer> com2 = (o1, o2) -> Integer.compare(o1,o2);
//方法引用
Comparator<Integer> com3 = Integer::compare;
}
语法格式
语法格式一:无参,无返回值
Runnable t1 = ()->System.out.println("dddd");
语法格式二:一个参数,无返回值
Consumer<String> con2 = (String s)->System.out.println(s);
语法格式三:数据类型可省略
Consumer<String> con2 = (s)->{System.out.println(s);};
语法格式四:Lambda 若只需要一个参数时,参数的小括号可以省略
Consumer<String> con2 = s->{System.out.println(s);};
语法格式五:Lambda 需要两个或以上的参数,多条执行语句,并且可以有返回值
Comparator<Integer> com2 = (o1,o2)->{
System.out.println(o1);
System.out.println(o2);
return o1.compareTo(o2);
};
语法格式六:当 Lambda 体只有一条语句时,return 与大括号若有,都可以省略
//只有一条语句时,则可以省略{},若该条语句为返回值,则省略{}的同时必须省略return
Comparator<Integer> com2 = (o1,o2)->o1.compareTo(o2);
函数式接口(Functional)
如果一个接口中只声明了一个方法,则此接口称为函数式接口
//@FunctionalInterface表示这个接口为函数式接口
@FunctionalInterface
public interface MyInterface {
void getName(String name);
}
MyInterface myInterface = name -> System.out.println("My name is " + name);
Java内置四大核心函数式接口
| 函数式接口 | 参数类型 | 返回类型 | 用途 |
|---|---|---|---|
| Consumer | T | void | 对类型为T的对象应用操作,包含方法: void accept(T t) |
| Supplier | 无 | T | T 返回类型为T的对象,包含方法:T get() R |
| Function<T, R> 函数型接口 | T | R | 对类型为T的对象应用操作,并返回结果。结 果是R类型的对象。包含方法:R apply(T t) |
| Predicate | T | boolean | 确定类型为T的对象是否满足某约束,并返回 boolean 值。包含方法:boolean test(T t) |
其他接口
.png)
//消费型接口
public void test01(){
happyTime(500,money->System.out.println("money:"+money));
}
public void happyTime(double money, Consumer<Double> con){
con.accept(money);
}
//断定型接口
public void test2(){
List<String> list = Arrays.asList("北京","南京","成都");
ArrayList list2 = filterString(list, s -> s.contains("京"));
}
//根据给定的规则过滤字符串,此规则由Predicate的方法决定
public ArrayList filterString(List<String> list, Predicate<String> pre){
ArrayList<String> filterList= new ArrayList<>();
for(String s:list){
if(pre.test(s)){
filterList.add(s);
}
}
return filterList;
}