网站建设的前后台代码如何设计网站步骤
目录
一、Lambda表达式是什么?什么场景下使用Lambda?
1.Lambda 表达式是什么
2.函数式接口是什么
第二章、怎么用Lambda
1.必须有一个函数式接口
2.省略规则
3.Lambda经常用来和匿名内部类比较
第三章、具体使用场景举例()
1.案例一,自己写一个表达式
一、Lambda表达式是什么?什么场景下使用Lambda?
1.Lambda 表达式是什么
1.Lambda 表达式本质上是一个匿名方法,是JAVA8中提供的一种新的特性(一种新的表达方式,以前旧的写法换成新的写法,可以写出更简洁、更灵活的代码)。
我们以前定义一个方法总是想到方法的五要素:
修饰符 返回值类型 方法名(参数列){方法体}
2.我要打印一段话,用Lambda翻新成一个匿名方法,语法格式如下:
以前写个方法:
public void prin(){
System.out.println(" 打印这个Lambda啊");
}现在用Lambda写:
最简单的三要素:
参数列表 操作符箭头 方法体() -> {System.out.println(" 打印这个Lambda啊");}
注意:直接把下面这段拿去运行是不行的,忍住先往下看:
() -> { System.out.println(" 打印这个Lambda啊");}
在这个基础上我们进行拓展丰富,在参数列表里放一个参数。
注意:这个也不能运行
有一个参数,并且无返回值;
参数列表里放个参数a 操作符箭头 方法体(参数a) -> System.out.println(a);
继续丰富,在参数列表里放两个参数,有返回值。
注意1:前面多了个Comparator com =
注意2:可以复制运行了。因为这段代码前面多了一个Comparator com =,这Comparator是个接口,而且是函数式接口,那么函数式接口是什么。
//有两个以上的参数,有返回值,并且大括号方法体里头多条语句
Comparator com = (a, b) -> {
System.out.println("打印一下"); return Integer.compare(10, 11);
};
2.函数式接口是什么
接口好理解,那什么是函数式接口呢?函数式接口是有且仅有一个抽象方法(不包含object中的方法)的接口。注意:我们只需要关注抽象方法的个数,不用关注其他类型的方法个数。
如图:我们可以用注解@FunctionalInterface 检测是否为函数式接口
第二章、怎么用Lambda
1.必须有一个函数式接口
看了第一章我们知道,Lambda表达式前面放普通接口是不行的,必须是Comparator 这种函数式接口。如图Collection接口不是函数式接口,报错了:
把Collection接口换成函数式接口Consumer 就可以复制运行了。
//Consumer 是函数式接口
Consumer con = (x) -> System. out .println(x);con.accept( "这个可以运行打印了" );
2.省略规则
1. 参数类型必须同时省略
2. 一个参数时,参数的括号可省略
3. 代码块里只有一句时,可省略大括号,分号和return
Comparator com = (x, y) -> Integer.compare(10, 13);
3.Lambda经常用来和匿名内部类比较
但注意:
1.Lambda表达式虽然简洁,用()->就可以代替整个匿名内部类,但只能用于函数式接口(有仅只有一个抽象方法的接口)。匿名内部类却可以用于接口,抽象类或者普通类。举个函数式接口Runnable接口的例子:
new Thread(new Runnable() {@Overridepublic void run() {System.out.println("这是匿名内部类里传了个Runnable的实现类对象");}}).start();
用Lambda写一下
//楞是把参数都省了new Thread(() -> System.out.println("好家伙这么简洁")).start();
第三章、具体使用举例()
1.案例一,自己写一个Lambda表达式
1.自己写一个函数式接口注意只能有一个抽象方法
public interface Test {
//有且仅有一个抽象方法public String Test1(String test_str);
}
2.Lambda表达式
Test test =(str)->{ System.out.println(str); return str;};String str=test.test1("打印一下1");System.out.println(str);}
2.案例二,Lambda表达式创建线程
这是普通的匿名内部类创建线程
// 匿名内部 类new Thread(new Runnable() {@Overridepublic void run() {System.out.println("匿名对象 传递线程任务.....");}}).start();
再用Lambda表达式写
/*Lambda表达式 省略格式
1. 参数类型必须同时省略
2. 一个参数时,参数的括号可省略
3. 代码块里只有一句时,可省略大括号,分号和return */new Thread(() -> System.out.println("Lambda表达式 启动线程...")).start();
3.案例三,Lambda表达式写Comparator接口比较器
public class Demo02_Comparator {public static void main(String[] args) {// 创建集合ArrayList<Integer> list = new ArrayList<>();Collections.addAll(list, 1, 3, 2, 4, 5, 7, 9, 8, 6);// sort(list); 升序 排序Collections.sort(list);System.out.println(list);分割线///// reverse(list)方法反转指定列表中元素的顺序。Collections.reverse(list);System.out.println(list);//分割线////*//匿名内部类 写降序排序,Collections.sort(List<T> list, Comparator<? super T> c)Collections.sort(list, new Comparator<Integer>() {@Overridepublic int compare(Integer o1, Integer o2) {return o2 - o1;}});*////分割线/////lambda表达式写 降序排序//Collections.sort(list,(Integer o1, Integer o2)->{ return o2 - o1;});//简化格式Collections.sort(list,(o1,o2)-> o2 - o1);System.out.println(list);