Comparator<String> com = new Comparator<String>(){
@Override
public int compare(String o1, String o2) {
return Integer.compare(o1.length(), o2.length());
}
};
TreeSet<String> ts = new TreeSet<>(com);
Integer.compare(o1.length(), o2.length());
Comparator<String> com = (x, y) -> Integer.compare(x.length(), y.length());
TreeSet<String> ts = new TreeSet<>(com);
(x, y) -> Integer.compare(x.length(), y.length())
interface Eatable {
void taste();
}
interface Flyable {
void fly(String weather);
}
interface Addable {
int add(int a, int b);
}
public class LambdaQs {
public void eat(Eatable e) {
System.out.println(e);
e.taste();
}
public void drive(Flyable f) {
System.out.println("我正在驾驶" + f);
f.fly("碧空如洗的晴日");
}
public void test(Addable add) {
System.out.println("5+3的和为" + add.add(5, 3));
}
public static void main(String[] args) {
LambdaQs lq = new LambdaQs();
// Lambda表达式的代码块只有一条语句,可以省略花括号
lq.eat(() -> System.out.println("苹果的味道不错"));
// Lambda表达式的形参列表只有一个形参,可以省略圆括号
lq.drive(weather -> {
System.out.println("今天天气是" + weather);
System.out.println("直升机飞行平稳");
});
// Lambda表达式的代码块只有一条语句,可以省略花括号
// 代码块中只有一条语句,即使该表达式需要返回值,也可以省略return关键字
lq.test((a, b) -> a + b);
}
}
// 正确的函数式接口
@FunctionalInterface
public interface TestInterface {
// 抽象方法
public void sub();
// java.lang.Object中的方法不是抽象方法
public boolean equals(Object var1);
// default不是抽象方法
public default void defaultMethod(){
}
// static不是抽象方法
public static void staticMethod(){
}
}
种类 | 示例 | 说明 | 对应的Lambda表达式 |
引用类方法 | 类名::类方法 | 函数式接口中被实现方法的全部参数传给该类方法作为参数 | (a,b,...)->类名.类方法(a,b,...) |
引用特定对象的实例方法 | 特定对象::实例方法 | 函数式接口中被实现方法的全部参数传给该方法作为参数 | (a,b,...)->特定对象.实例方法(a,b,...) |
引用某类对象的实例方法 | 类名::实例方法 | 函数式接口中被实现方法的第一个参数作为调用者,后面的参数全部传给该方法作为参数 | (a,b,...)->a.实例方法(b,...) |
引用构造器 | 类名::new | 函数式接口中被实现方法的全部参数传给该构造器作为参数 | (a,b,...)->new 类名(a,b,...) |
@FunctionalInterface
interface Converter{
Integer convert(String from);
}
//传统Lambda表达式写法
Converter con = from -> Integer.valueOf(from);
Integer val = con.convert("99");
System.out.println(val); // 输出99
System.out.println("-----------------------------------------");
//引用类方法
//函数式接口中被实现方法的全部参数传给该类方法作为参数
Converter con2 = Integer::valueOf;
Integer val2 = con2.convert("99");
System.out.println(val2); // 输出99
//传统Lambda表达式写法
Converter con = from -> "itcast".indexOf(from);
//函数式接口中被实现方法的全部参数传给该方法作为参数
Converter con2 = "itcast"::indexOf;
//传统Lambda表达式写法
BiPredicate<String, String> bp = (x, y) -> x.equals(y);
System.out.println(bp.test("abcde", "abcde"));
System.out.println("-----------------------------------------");
//引用某类对象的实例方法
BiPredicate<String, String> bp2 = String::equals;
System.out.println(bp2.test("abc", "abc"));
public class Employee {
private int id;
private String name;
private int age;
private double salary;
public Employee() {
}
public Employee(String name) {
this.name = name;
}
public Employee(String name, int age) {
this.name = name;
this.age = age;
}
public Employee(int id, String name, int age, double salary) {
this.id = id;
this.name = name;
this.age = age;
this.salary = salary;
}
}
Supplier<Employee> sup = () -> new Employee();
System.out.println("------------------------------------");
// 无参构造
Supplier<Employee> sup2 = Employee::new;
// 一个参数的构造器
Function<String, Employee> fun = Employee::new;
System.out.println(fun.apply("a"));
// 两个参数的构造器
BiFunction<String, Integer, Employee> fun2 = Employee::new;
System.out.println(fun2.apply("b", 11));
匿名内部类 | Lambda表达式 |
抽象类甚至普通类创创建实例(不管有多少个抽象方法) | 只能为函数式接口创建实例(单方法) |
抽象方法体允许调用接口中的默认方法 | 不允许调用接口中的默认方法 |
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) | 黑马程序员IT技术论坛 X3.2 |