功能接口:只包含一個(gè)方法的接口被稱為功能接口,Lambda 表達(dá)式用用于任何功能接口適用的地方。函數(shù)集合:Java 8 的類庫(kù)包含一個(gè)新的包java.util.functions ,這個(gè)包中有很多新的功能接口,這些接口可與集合API 一起使用。
java.util.functions.Predicate;
使用謂詞(Predicate) 來(lái)篩選集合:
List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "Dave");
List<String> filteredNames = names.filter(e -> e.length() >= 4) .into(new ArrayList<String>());
for (String name : filteredNames) {
System.out.println(name); }
這里我們有兩個(gè)新方法:
Iterable<T> filter(Predicate<? super T>) 用于獲取元素滿足某個(gè)謂詞返回true 的結(jié)果
<A extends Fillable<? super T》 A into(A) 將用返回的結(jié)果填充ArrayList
java.util.functions.Block我們可使用一個(gè)新的迭代器方法來(lái)替換for 循環(huán)void forEach(Block<? super T>):
List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "Dave");
names .filter(e -> e.length() >= 4)
.forEach(e -> { System.out.println(e); });
forEach() 方法是internal iteration 的一個(gè)實(shí)例:迭代過程在Iterable 和Block 內(nèi)部進(jìn)行,每次可訪問一個(gè)元素。
最后的結(jié)果就是用更少的代碼來(lái)處理集合:
List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "Dave");
names.mapped(e -> { return e.length();
}) .asIterable() // returns an Iterable of BiValue elements
// an elements key is the persons name, its value is the string length.filter(e -> e.getValue() >= 4)。sorted((a, b) -> a.getValue() - b.getValue()) .forEach(e -> { System.out.println(e.getKey() + + e.getValue()); }); 這樣做的優(yōu)點(diǎn)是:元素在需要的時(shí)候才進(jìn)行計(jì)算如果我們?nèi)∫粋€(gè)上千個(gè)元素的集合的前三條時(shí),其他元素就不會(huì)被映射鼓勵(lì)使用方法鏈我們無(wú)需才存儲(chǔ)中間結(jié)果來(lái)構(gòu)建新的集合內(nèi)部迭代過程因此大多數(shù)細(xì)節(jié)。
例如,我們可以通過下面代碼來(lái)并行map() 操作
writing myCollection.parallel()。map(e ?> e.length())。
方法引用:我們可通過:: 語(yǔ)法來(lái)引用某個(gè)方法。方法引用被認(rèn)為是跟Lambda 表達(dá)式一樣的,可用于功能接口所適用的地方。
我們可以引用一個(gè)靜態(tài)方法:
executorService.submit(MethodReference::sayHello);
private static void sayHello() {System.out.println("hello"); } 或者是一個(gè)實(shí)例的方法:
Arrays.asList("Alice", "Bob", "Charlie", "Dave")。forEach(System.out::println); 我們也可以創(chuàng)建工程方法并將構(gòu)造器引用賦值給java.util.functions.Factory:
Factory<Biscuit> biscuitFactory = Biscuit::new;
Biscuit biscuit = biscuitFactory.make(); 最后,我們創(chuàng)建一個(gè)引用到隨意實(shí)例的例子:
interface Accessor<BEAN, PROPERTY> {
PROPERTY access(BEAN bean); }
public static void main(String[] args) {
Address address = new Address("29 Acacia Road", "Tunbridge Wells");
Accessor<Address, String> accessor = Address::getCity;
System.out.println(accessor.access(address)); }
這里我們無(wú)需綁定方法引用到某個(gè)實(shí)例,我們直接將實(shí)例做為功能接口的參數(shù)進(jìn)行傳遞。