目錄
- lambda語法
- 看懂lambda
- lambda開發中常見的應用
序:近日在某大型同性交友群裝逼,貼了下自己的代碼,并立下豪言,要寫篇文章傳授群友java lambda精髓,冷靜后仔細想來,所謂碼如其人,自己代碼好看不過是因為自己長得好看而已,并沒有什么精髓成份,又好面子,不好拒絕,一番思想爭斗,懷沉重心情寫下此文,

lambda語法
型別為介面,有且只有一個需要實作的方法,就可以使用一個運算式作為該介面的實作
看懂lambda
java lambda有能力表達一個完整的方法簽名(帶回傳值),但在開發中總是寫全lambda并不能達到簡化代碼的效果,因此開發中我們更愿意使用lambda簡化后的寫法,
package com.karmic.lambda;
import java.util.function.Function;
import java.util.function.Supplier;
/**
* @author karmic
*/
public class LambdaDemo {
public static void main(String[] args) {
//lambda完全體
Function<String, Integer> f1 = (Function<String, Integer>) (String s) -> Integer.parseInt(s);
//簡化回傳型別
Function<String, Integer> f2 = (String s) -> Integer.parseInt(s);
//簡化入參型別
Function<String, Integer> f3 = (s) -> Integer.parseInt(s);
//單入參省略入參()
Function<String, Integer> f4 = s -> Integer.parseInt(s);
//運算式呼叫的方法 簽名和回傳值與介面一致時 使用::簡化運算式
Function<String, Integer> f5 = Integer::parseInt;
//類::靜態方法 或 物件::物件方法 可以轉換成簽名相同的方法
Supplier<String> a1 = DemoBean::getA;
Supplier<String> a2 = new DemoBean()::getB;
//類::物件方法 可以轉換成簽名第一個入參為類物件,其余簽名一致的介面
Function<DemoBean, String> bf = DemoBean::getB;
}
static class DemoBean {
public static String getA() {
return "A";
}
public String getB() {
return "B";
}
}
}

lambda開發中常見的應用
優雅的繞過NullPointException
package com.karmic.lambda;
import java.util.Optional;
/**
* @author karmic
*/
public class NullExceptionAvoid {
public static void main(String[] args) {
A a = new A(new B(null));
String s = Optional.of(a).map(A::getB).map(B::getC).map(C::getS).orElse(null);
System.out.println(s);
}
static class A {
B b;
public A(B b) {
this.b = b;
}
public B getB() {
return b;
}
}
static class B {
C c;
public B(C c) {
this.c = c;
}
public C getC() {
return c;
}
}
static class C {
String s;
public C(String s) {
this.s = s;
}
public String getS() {
return s;
}
}
}
放棄代碼執行控制權
// Create bean instance.
if (mbd.isSingleton()) {
sharedInstance = getSingleton(beanName, () -> {
try {
// Spring原始碼,createBean方法是否執行的控制權,由getSingleton控制 判斷bean是否已經創建過,再決定是否呼叫createBean方法
return createBean(beanName, mbd, args);
}
catch (BeansException ex) {
// Explicitly remove instance from singleton cache: It might have been put there
// eagerly by the creation process, to allow for circular reference resolution.
// Also remove any beans that received a temporary reference to the bean.
destroySingleton(beanName);
throw ex;
}
});
bean = getObjectForBeanInstance(sharedInstance, name, beanName, mbd);
}
MR式資料處理
package com.karmic.lambda;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;
/**
* @author karmic
*/
public class StreamWordCountDemo {
public static void main(String[] args) {
@SuppressWarnings("serial")
List<String> list = new ArrayList<String>() {
{
add("hello world");
add("hello java");
add("hello python");
add("hello kotlin");
}
};
Map<String, Long> map = list.stream().map(s -> s.split(" "))
.flatMap(Arrays::stream)
.collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));
System.out.println(map);
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/226201.html
標籤:java
上一篇:約瑟夫問題
下一篇:雜談JVM(萬字手打)
