Java——Lambda
1.8的新特性:
- Lambda表达式
- 为了简化匿名内部类的
- 使用前提:
- 函数式接口: 必须要重写的抽象方法只有一个的接口
- 检测一个 接口是否为函数式接口: @FunctionalInterface
- 语法: ()->{};
- () 方法的参数列表
- {} 重写抽象方法的方法体
- -> 箭头符号 lmabda符号
public class LambdaDemo01 {
public static void main(String[] args) {
//匿名 内部类
/*
* Smoke s = new Smoke() {
*
* @Override public void Smoking() {
*
* } };
*/
//Lambda写法 1
/*
* Smoke s1 = ()->{ System.out.println("边吸烟边吐烟圈 ..."); };
*/
//Lambda写法 2 如果方法体只有一句,前后的{}可以省略
/* Smoke s2 = ()->System.out.println("边吸烟边吐烟圈 2..."); */
//Lambda写法3 如果抽象方法有参数,参数的数据类型可以省略
/* Smoke s3 = (a)->System.out.println("边吸烟边吐烟圈 3..."+a); */
//Lambda写法4 如果参数只有一个,前后的()可以省略
/* Smoke s4 = a->System.out.println("边吸烟边吐烟圈 4..."+a); */
//Lambda写法5 如果方法体语句只有一句,并且是return返回值语句,前后的{}与return关键字可以一起省略
Smoke s5 = i-> "最后"+i;
System.out.println(s5.Smoking(3));
}
}
@FunctionalInterface
interface Smoke{
String Smoking(int a);
}
题一:调用Arrays.sort()方法,通过定值排序比较两个Employee(先按年龄比,年龄相同按姓名比),使用Lambda作为参数传递
分析:
1.定制排序:指自定义比较器|定制排序
自然排序:内部比较器|自然排序
2.先比较年龄,年龄相同才比较姓名
import java.util.Arrays;
import com.shsxt.bean.Employee;
public class TestLambda01 {
public static void main(String[] args) {
Employee[] arr= {new Employee("姜首航",18),new Employee("姜云英",17),new Employee("姜子牙",18)};
System.out.println(Arrays.deepToString(arr));
//定制排序 比较年龄,年龄相同才比较姓名
Arrays.sort(arr,(Employee e1,Employee e2)->{
if(e1.getAge() == e2.getAge()) {
return e1.getName().compareTo(e2.getName());
}
return e1.getAge() - e2.getAge();
});
System.out.println(Arrays.deepToString(arr));
System.out.println((int)'子');
System.out.println((int)'首');
}
}
习题二:
- 1)声明函数式接口,接口中声明抽象方法,public String getValue(String str)
- 2)声明类 TestLambda,类中编写方法使用接口作为参数,讲一个字符串转成大写,并作为方法的返回值 toUpperCase
- 3)再将一个字符串的第2个和第4个索引位置进行截取子串 subString()
public class TestLambda02 {
public static void main(String[] args) {
String upper = strHandler("haha", (str)->{return str.toUpperCase();});
System.out.println(upper);
String trim = strHandler(" 因为所以,科学道理 ", (str)->str.trim());
System.out.println(trim);
}
//工能的封装: 操作字符串
//参数: 字符串String,操作方式MyFunction 返回值:结果字符串String
public static String strHandler(String str,MyFunction fun) {
return fun.getValue(str);
}
}
@FunctionalInterface
interface MyFunction{
public String getValue(String str);
}
习题三:
- 1)声明一个带两个泛型的函数式接口,发型类型为<T,R> T为参数,R为返回值
- 2)接口中声明对应抽象方法
- 3)在TestLambda类中声明方法,参数三个,两个long类型的参数,接口作为参数,接口实现中计算两个long型参数的和
- 4)再计算两个long型参数的乘积
public class TestLambda03 {
public static void main(String[] args) {
op(10L, 20L, (x,y)->x+y);
op(10L, 20L, (x,y)->x*y);
}
//对两个lang类型参数进行某种操作 .结果打印 long->包装类->Long
public static void op(Long l1,Long l2,Function2<Long,Long> my) {
System.out.println(my.getValue(l1, l2));
}
}
//T为参数,R为返回值
interface Function2<T,R>{
public R getValue(T t1,T t2);
}