default拓展方法
java8為接口聲明添加非抽象方法的實(shí)現(xiàn),也成為拓展方法。
void doSomething();
default void before() {
System.out.println(“我是拓展方法”);
}
}
public class FormulaService implements Formula {
@Override
public void doSomething() {
before();
System.out.println(“我是override方法”);
}
}
Lambda表達(dá)式
java8引入函數(shù)式編程,Lambda則是函數(shù)式編程的基礎(chǔ)。
List《String》 list = Arrays.asList(“a”, “b”, “c”);
// java8之前
Collections.sort(list, new Comparator《String》(){
@Override
public int compare(String o1, String o2) {
return o1.compareTo(o2);
}
});
// lambda
Collections.sort(list, (String o1, String o2) -》 {
return o2.compareTo(o1);
});
// 簡潔lambda
Collections.sort(list, (String o1, String o2) -》 o2.compareTo(o1));
// 更簡潔lambda
Collections.sort(list, (o1, o2) -》 o2.compareTo(o1));
函數(shù)式接口
一個(gè)函數(shù)式接口有且只能有一個(gè)抽象方法申明,其中該注意的是 @FunctionalInterface 注解,此時(shí)如果在接口中定義了第二個(gè)抽象方法,編譯器將會(huì)拋出異常。當(dāng)然如果不加該注解也不是不行,如果接口中有多個(gè)抽象方法,而你又使用了lambda表達(dá)式,則在調(diào)用處會(huì)拋出異常。
@FunctionalInterface
public interface Formula《F,T》{
T convert(F var1);
}
Formula《String,Integer》 function = (var1 -》 Integer.valueOf(var1));
Integer var2 = function.convert(“1000”);
方法和構(gòu)造函數(shù)引用
方法引用的標(biāo)準(zhǔn)語法是 類名:方法名類型示例
引用靜態(tài)方法
Formula《String,Integer》 function = (Integer::valueOf);
Integer var2 = function.convert(“1000”);
引用某個(gè)類型的任意對象的實(shí)例方法
public static void main(String[] args) {
String[] array = {“賤明”, “學(xué)友”};
Arrays.sort(array, String::compareTo);
}
引用構(gòu)造方法
// 定義工廠
interface PersonFactory《P extends Person》{
P create(String name);
}
// Person類的構(gòu)造方法
public Person(String name) {
this.name = name;
}
// 創(chuàng)建
PersonFactory《Person》 factory = Person::new;
factory.create(“賤明”);
Lambda的范圍
lambda可以訪問局部對應(yīng)的外部區(qū)域的局部final變量,以及成員變量和靜態(tài)變量。
訪問成員變量
public void doSomething(){
final String p1 = “賤明”;
final String p2 = “學(xué)友”;
Formula function = (person1, person2) -》 p1.compareTo(p2);
}
與java8以下版本不同的是,p1 p2你可以不修飾成final 也不會(huì)報(bào)錯(cuò),但是如果你想修改他們,編譯器則會(huì)告訴你這是不被允許的。
訪問成員變量和靜態(tài)變量
public void doSomething(){;
Formula function = (person1, person2) -》{
dehua = “賤明”;
xueyou=“學(xué)友”;
return dehua.compareTo(xueyou);
};
}
內(nèi)置函數(shù)式接口
java8 api中提供了很多內(nèi)置函數(shù)式接口,而且有些接口其實(shí)在Google Guava中已經(jīng)實(shí)現(xiàn)了,很大程度的降低了程序員的工作負(fù)擔(dān)。
Predicates
Predicate是一個(gè)布爾類型的函數(shù),該函數(shù)只有一個(gè)輸入參數(shù),他包含了多種默認(rèn)實(shí)現(xiàn)。
public static void main(String[] args) {
Predicate《String》 predicate = (s) -》 s.contains(“賤明”);
String var1 = “牛賤明”;
predicate.test(var1); // true
predicate.negate().test(var1); // false
Predicate《Boolean》 nonNull = Objects::nonNull;
Predicate《Boolean》 isNull = Objects::isNull;
Predicate《String》 isEmpty = String::isEmpty;
Predicate《String》 isNotEmpty = isEmpty.negate();
isNotEmpty.and(isEmpty).test(var1);
}
Functions
Function接口接收一個(gè)參數(shù),并返回單一的結(jié)果。默認(rèn)方法可以將多個(gè)函數(shù)串在一起
public static void main(String[] args) {
Function《String, Integer》 toInteger = Integer::valueOf;
Function《String, String》 backToString = toInteger.andThen(String::valueOf);
System.out.println(toInteger.apply(“123”));
System.out.println(backToString.apply(“123”));
}
Suppliers
Supplier接口產(chǎn)生一個(gè)給定類型的結(jié)果。與Function不同的是,Supplier沒有輸入?yún)?shù)。
Supplier《Person》 personSupplier = Person::new;
Person p = personSupplier.get(); // new Person
Consumers
Consumer代表了在一個(gè)輸入?yún)?shù)上需要進(jìn)行的操作。
Consumer《Person》 greeter = (p) -》 System.out.println(“Hello, ” + p.getName());
greeter.accept(new Person(“賤明”));
Comparators
Comparator接口在早期的Java版本中非常著名。Java 8 為這個(gè)接口添加了不同的默認(rèn)方法。
Comparator《Person》 comparator = (p1, p2) -》 p1.getName().compareTo(p2.getName());
Person p1 = new Person(“賤明”);
Person p2 = new Person(“學(xué)友”);
System.out.println(comparator.compare(p1, p2)); // 》 1105
System.out.println(comparator.reversed().compare(p1, p2)); // 《 -1105
Optionals
Optional不是一個(gè)函數(shù)式接口,而是一個(gè)精巧的工具接口,用來防止NullPointerException產(chǎn)生。
Optional是一個(gè)簡單的值容器,這個(gè)值可以是null,也可以是non-null。考慮到一個(gè)方法可能會(huì)返回一個(gè)non-null的值,也可能返回一個(gè)空值。為了不直接返回null,我們在Java 8中就返回一個(gè)Optional。
Optional《String》 optional = Optional.of(“賤明”);
System.out.println(optional.isPresent()); // true
System.out.println(optional.get()); // 賤明
System.out.println(optional.orElse(“學(xué)友”)); // 賤明
optional.ifPresent((s) -》 System.out.println(s.charAt(0)));
評論
查看更多