Java8中引入了一个新的操作符->,该操作符称为箭头操作符或Lambda操作符,是对内部类的一种简化写法。
下面是一个对Comparator类的compare方法的匿名内部类的实现:
@Test
public void tset1() {
Comparator<Integer> com=new Comparator<Integer>() {
public int compare(Integer o1,Integer o2) {
return Integer.compare(o1, o2);
}
};
TreeSet<Integer> ts=new TreeSet<>(com);
}
下面是使用Lambda表达式代码:
@Test
public void test2() {
Comparator<Integer> com=(x,y)->Integer.compare(x, y);
TreeSet<Integer> ts=new TreeSet<>(com);
}
两种写法的结果都是相同的,但是使用Lambda表达式明显为书写提供了极大的方便。
如何书写Lambda表达式:
(参数) -> 表达示
->左侧:Lambda表达式的参数列表
->右侧:Lambda表达式中所需执行的功能,即Lambda体
例子:
- 无参数值,无返回值
//无参数,无返回值
@Test
public void test() {
Runnable r1=() -> System.out.println("Hello");
r1.run();
}
- 有一个参数值,无返回值
//有一个参数无返回值
@Test
public void test1() {
Consumer<String> con=(t) -> System.out.println(t);
con.accept("hello2");
}
- 有两个以上参数,有多条语句,有返回值
//有两个以上参数,有多条语句,有返回值
@Test
public void test2() {
Comparator<Integer> com=(x,y) -> {
System.out.println("ss");
return Integer.compare(x, y);
};
System.out.println(com.compare(3, 2));
}
总结:
- 若只有一个参数,小括号可以省略不写
- 若只有一条执行语句,大括号和return都可以不写
使用方法注入
- 对象::实例方法名
- 类::静态方法名
- 类::实例方法名
1.对象::实例方法名
public void test1() {
Consumer<String> con=(x) -> System.out.println(x);
PrintStream ps=System.out;
Consumer<String> con1=ps::println;
con.accept("ss");
con.accept("ss");
}
注意:此处使用方法引用要确保所引用的方法和接口中的方法的参数和返回值类型相同
2.类::静态方法名
@Test
public void test() {
Comparator<Integer> com=Integer::compare;
//Comparator<Integer> com=(x,y) -> Integer.compare(x,y);
System.out.println(com.compare(1, 2));
}
3. 类::实例方法名
@Test
public void test3() {
//BiPredicate<String,String> bp=(x,y) -> x.equals(y);
BiPredicate<String,String> bp=String::equals;
System.out.println(bp.test("aa","aa"));
}
注意:如果第一个参数是实例方法的调用者,第二个参数是实例方法的参数时,类似于(x,y) -> x.equals(y),才可以使用类::实例方法名的写法。