代碼,自然寫的越簡潔越好啦,寫的人舒服,看的人也舒服,一切為了高效。
要把有限的時間花到其它有意思的事情上去。
目的
學習簡化代碼的思路,使用jdk8新特性lamada表達式。
推理一下
某接口,隻有一個方法。
比如這個:
package java.lang;
@FunctionalInterface
public interface Runnable {
void run();
}
或者是這個:
interface MyInterface{
void sayHi();
}
實作接口,使用方法
一般我們要使用Runable子類開啟一個線程,要實作Runnable接口,調用Threead類的start方法:
public class LeaningLamda implements Runnable{
public static void main(String[] args) {
new Thread(new LeaningLamda()).start();
}
@Override
public void run() {
System.out.println(this.getClass()+"我已經在跑了!");
}
}
或者用sayHi方法幹點什麼,要先實作接口,再調用:
public class LeaningLamda2 implements MyInterface{
public static void main(String[] args) {
new LeaningLamda2().sayHi();
}
@Override
public void sayHi() {
System.out.println("ok ok ok ok ,i am say Hi!");
}
}
interface MyInterface{
void sayHi();
}
内部類實作接口,使用方法
如果這個方法我就用一次,那我可以在内部類中實作它,提高程式性能:
public class LeaningLamda{
static class MyRun implements Runnable{
@Override
public void run() {
System.out.println(this.getClass()+"我已經在跑了!");
}
}
public static void main(String[] args) {
new Thread(new MyRun()).start();
}
}
一樣的用sayHi方法:
public class LeaningLamda2 {
static class MyHi implements MyInterface{
@Override
public void sayHi() {
System.out.println("ok ok ok ok ,i am say Hi!");
}
}
public static void main(String[] args) {
new MyHi().sayHi();
}
}
interface MyInterface{
void sayHi();
}
局部内部類實作接口,使用方法
既然隻使用一次,那我為啥不把它放在使用的方法裡面去,性能不就又UpUpUpUp。
像這樣:
public class LeaningLamda{
public static void main(String[] args) {
class MyRun implements Runnable{
@Override
public void run() {
System.out.println(this.getClass()+"我已經在跑了!");
}
}
//調用在定義後面,謝謝。
new Thread(new MyRun()).start();
}
}
或是這樣:
public class LeaningLamda2 {
public static void main(String[] args) {
class MyHi implements MyInterface{
@Override
public void sayHi() {
System.out.println("ok ok ok ok ,i am say Hi!");
}
}
new MyHi().sayHi();
}
}
interface MyInterface{
void sayHi();
}
匿名内部類實作接口,使用方法
我就用一次,要什麼名字啊?能少輸入一個字元都是賺的。需要借助父類或者接口名來實作。
你看:
public class LeaningLamda{
public static void main(String[] args) {
//需要借助父類或者接口來聲明
new Thread(new Runnable(){
@Override
public void run() {
System.out.println(this.getClass()+"我已經在跑了!");
}
}).start();
}
}
又如:
public class LeaningLamda2 {
public static void main(String[] args) {
new MyInterface(){
@Override
public void sayHi() {
System.out.println("ok ok ok ok ,i am say Hi!");
}
}.sayHi();
}
}
interface MyInterface{
void sayHi();
}
使用lamda表達式的,實作方法
jdk 8 看不下去了,給我們提供了一個更加簡化的方案,你看:
lamda表達式實作建立單個簡單線程:
public class LeaningLamda{
public static void main(String[] args) {
new Thread(()-> {
System.out.println("我已經在跑了!");
}
).start();
}
}
lamda表達式sayHi:
public class LeaningLamda2 {
public static void main(String[] args) {
//此處需要借助一個父類或接口對象來存放,調用它
MyInterface ls = ()->{
System.out.println("ok ok ok ok ,i am say Hi!"); };
ls.sayHi();
}
}
interface MyInterface{
void sayHi();
}
可帶參數
lamda表達式可以帶參數,可以不指定類型,它會自适應類型:
public class LeaningLamda2 {
public static void main(String[] args) {
MyInterface ls = (i,str)->{
System.out.println("int:"+i);
System.out.println("String:"+str);};
ls.sayHi(520,"i love you!");
}
}
interface MyInterface{
void sayHi(int i,String str);
}
運作結果:
隻有一個參數
那我括号都可以省了!
public class LeaningLamda2 {
public static void main(String[] args) {
MyInterface ls = str-> {System.out.println("String:"+str);};
ls.sayHi("i love you!");
}
}
interface MyInterface{
void sayHi(String str);
}
運作結果:
有傳回值
如果有傳回值呢,正常傳回:
public class LeaningLamda2 {
public static void main(String[] args) {
MyInterface ls = (String str)-> {
String str2 = "最後的赢家是:"+str;
return str2;};
System.out.println(ls.sayHi("lurenjia"));
}
}
interface MyInterface{
String sayHi(String str);
}
隻有一條語句
如果方法隻有一條語句,那大括号也沒有必要,可以省略:
public class LeaningLamda2 {
public static void main(String[] args) {
MyInterface ls = (int i,String str)-> System.out.println("int:"+i+"----String:"+str);
ls.sayHi(520,"i love you!");
}
}
interface MyInterface{
void sayHi(int i,String str);
}
究極省略,不能再省了
就一條語句,是傳回值:
public class LeaningLamda2 {
public static void main(String[] args) {
MyInterface ls = str-> "最後的赢家是:"+str;
System.out.println(ls.sayHi("中國"));
}
}
interface MyInterface{
String sayHi(String str);
}
運作結果:
lamda總結
常用于建立簡單線程。
1、接口隻有一個方法,可有參數,可有傳回值。
2、本方法内容簡單,使用較少。
3、基本形式為:
接口或父類 名稱 = (參數類型1 參數1,參數類型2 參數2,...)->{
内容
};
名稱.方法(參數1,參數2,...);
4、可以省略的是:
1、lamada參數類型可省,它自适應。
2、方法内容隻有一條内容,大括号可省。
3、内容隻有一句傳回語句,return可省,直接寫值。