public class Test {
public static void main(String[] args) {
// 无参无返回值
/*useEatable(new Eatable() {
@Override
public void eat() {
System.out.println("吃冰激凌");
}
});*/
// useEatable(()-> System.out.println("吃冰激凌"));
// 有参无返回值
/*useEatable2(new Eatable2() {
@Override
public void eat(String something) {
System.out.println("吃" + something);
}
});*/
/*useEatable2((a)->{
System.out.println("吃"+a);
});*/
//有参有返回值
/*String s = useEatable3(new Eatable3() {
@Override
public String eat(String something) {
System.out.println("吃" + something);
return "好吃";
}
});
System.out.println(s);*/
/*String s = useEatable3((a) -> {
System.out.println("吃" + a);
return "好吃";
});*/
String s = useEatable3(a -> {return a+"ads";});
System.out.println(s);
}
interface Eatable {
void eat();
default void drink(){
System.out.println("喝果汁");
};
}
private static void useEatable(Eatable e) {
e.eat();
}
interface Eatable2 {
void eat(String something);
}
private static void useEatable2(Eatable2 e) {
e.eat("冰激凌");
}
interface Eatable3 {
String eat(String something);
}
private static String useEatable3(Eatable3 e) {
return e.eat("冰激凌");
}
}
Eatable,Eatable2,Eatable3是接口,我在这定义成了内部类,也可以放在外面
总结一下,lambda表达式使用条件
1,方法(包括构造方法)的参数是接口
2,接口内只有一个未被实现的方法(default修饰的方法有默认实现)
lambda表达式使用场景
创建线程的时候
new Thread(new Runnable() {
@Override
public void run() {
}
}).start();
//可以写成如下代码
new Thread(()->{
}).start();
遍历集合的时候
List<String> players = new ArrayList<>();
//虽然是空的,但是我们假装里面有东西
players.forEach((a)->{
System.out.println(a);
});
//可以简写成如下格式(但是我觉得这玩意没用,正式开发中我们还是得操作数据)
players.forEach(System.out::println);
数组排序
String[] atp = {"Rafael Nadal", "Novak Djokovic",
"Stanislas Wawrinka",
"David Ferrer","Roger Federer",
"Andy Murray","Tomas Berdych",
"Juan Martin Del Potro"};
Arrays.sort(atp,(String a,String b) -> (a.compareTo(b)));
其他的之后再研究