Java1.8新特性
Lambda表达式
/**
* Lambda表达式的使用
* 1. 举例: (o1,o2) -> Integer.compare(o1,o2)
* 2. 格式:
* -> : Lambda操作符 或 箭头操作符
* -> : 左边 lambda形参列表 (其实就是接口中的抽象方法的形参列表)
* -> : lambda体 (其实就是重写的抽象方法的方法体)
* 3. lambda表达式的使用 : ( 分为六种情况)
* 总结:
* -> 左边 : Lambda形参列表的参数类型可以省略(类型推断);如果lambda形参列表只有一个参数,其一对小括号可以省略
* -> 右边 : Lambda体应该使用一对{} 包裹; 如果lambda体只有一条执行语句(可能是 return 语句),可以省略这一对{}和return关键字;
* 4. lambda表达式的本质 : 做为函数式接口的实例
*
* 5. 如果一个接口中,只声明了一个抽象方法,则此接口就称为函数式接口
*
* 6. 所以以前用匿名实现类表示的现在都可以用Lambda表达式来写。
*/
/**
* java内置的四大核心函数式接口
*
* 消费型接口 Consumer<T> void accept(T t)
* 供给型接口 Supplier<T> T get()
* 函数式接口 Function<T,R> R apply(T t)
* 断定型接口 Predicate<T> boolean test(T t)
*/



1.无参,无返回值
@Test
public void test1(){
Runnable r1 = new Runnable(){
@Override
public void run() {
System.out.println("我爱北京天猫");
}
};
r1.run();
Runnable runnable = ()-> System.out.println("我爱添加");
runnable.run();
}
2.需要一个参数,但是没有返回值
@Test
public void test2(){
Consumer<String> consumer = new Consumer<String>() {
@Override
public void accept(String s) {
System.out.println(s);
}
};
consumer.accept("谎言和誓言的区别是什么?");
System.out.println("**********************");
Consumer<String> consumer1 = (String s) -> {
System.out.println(s);
};
consumer1.accept("一个是听得人当真了,一个是说的人当真了");
}
3.数据类型可以省略,因为可以由编译器推断得出,称为类型推断
@Test
public void test3(){
Consumer<String> consumer = s -> {
System.out.println(s);
};
consumer.accept("今天不学习,明天变垃圾");
}
4 Lambda 若只需要一个参数时,参数的小括号可以省略
@Test
public void test4(){
Consumer<String> consumer = s -> {
System.out.println(s);
};
consumer.accept("学是学不进去了,睡又不敢睡");
}
5.Lambda 需要两个或以上的参数,多条执行语句,并且可以有返回值
@Test
public void test5(){
Comparator<Integer> comparator = new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
System.out.println(o1);
System.out.println(o2);
return o1.compareTo(o2);
}
};
System.out.println(comparator.compare(12,21));
System.out.println("****************");
Comparator<Integer> comparator1 = (o1,o2) -> {
System.out.println(o1);
System.out.println(o2);
return o1.compareTo(o2);
};
System.out.println(comparator1.compare(12,6));
}
6. 当Lambda体只有一条语句时,return 与大括号 若有,都可以省略
@Test
public void test6(){
Comparator<Integer> comparator = new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o1.compareTo(o2);
}
};
System.out.println(comparator.compare(12,21));
System.out.println("****************");
Comparator<Integer> comparator1 = (o1,o2) ->o1.compareTo(o2);
System.out.println(comparator1.compare(12,6));
}

7. 消费型接口
@Test
public void test8(){
happyTime(500, new Consumer<Double>() {
@Override
public void accept(Double aDouble) {
System.out.println("学习太累了,去天上人间买了瓶矿泉水,价格为: " + aDouble);
}
});
System.out.println("***************************");
happyTime(400,money -> System.out.println("学习太累了,去天上人间买了瓶矿泉水,价格为: " + money));
}
void happyTime(double money,Consumer<Double> con){
con.accept(money);
}
8.自定义函数式接口
/**
* @author caoweifeng
* @version 1.00
* @date 2020/10/30 21:04
*/
@FunctionalInterface
public interface MyInterface {
void method();
}