package com.demo; public interface Animal { /** * 接口靜態方法 * @param food * @return */ public static String eat(String food){ return String.format("%s吃完了",food); } /** * 默認方法 * @return */ default String getName(){ return "動物"; }; }
package com.demo; public interface Biology { default String getName(){ return "生物"; }; }
package com.demo; /** * 當子類中沒有重寫默認方法時 使用接口默認方法 */ public class Caterpillar implements Animal{ }
package com.demo; public class Cattle implements Biology,Animal { /** * 當兩個接口具備相同的默認方法時,須要子類重寫該方法 * @return */ @Override public String getName() { return Biology.super.getName(); } }
package com.demo; public class Girl extends Person{ /** * 當子類重寫父類方法時 使用子類中的方法 * @return */ @Override public String getName() { return "女人"; } }
package com.demo; /** * 當子類繼承父類 又實現接口時 使用類中的方法 */ public class Man extends Person implements Animal { }
package com.demo; public class Person implements Animal { /** * 當子類實現默認方法時 使用子類中的方法,且子類實現的方法保護級別必須時public公共的沒有變化 * * @return */ @Override public String getName() { return "人"; } }
package com.demo; import org.junit.Assert; import org.junit.Test; import java.util.Arrays; import java.util.Optional; import java.util.stream.Stream; /** * demo */ public class Demo { /** * 接口靜態方法:方便開發人員將語義想同的方法放到一塊兒,而不是新建工具包。更好的閱讀和組織代碼。 */ @Test public void test() { String song = Animal.eat("song"); Assert.assertEquals("song吃完了",song); } /** * 默認方法的引入主要是爲了解決JDK8在一些接口中添加了新的方法,而不能兼容JDK8之前寫的代碼。 */ @Test public void test1() { Person person = new Person(); Assert.assertEquals("人",person.getName()); Girl girl = new Girl(); Assert.assertEquals("女人",girl.getName()); Man man = new Man(); Assert.assertEquals("人",man.getName()); Caterpillar caterpillar = new Caterpillar(); String name = caterpillar.getName(); Assert.assertEquals("動物",name); Cattle cattle = new Cattle(); Assert.assertEquals("生物",cattle.getName()); } /** * 方法引用 */ @Test public void test2(){ Person []person = person = new Person[5]; //常規寫法 Stream<String> strs = Arrays.stream(person).map(x -> x.getName()); //簡化寫法 // 可將x -> x.getName() 簡化成(類名::方法名) // (name, nationality) -> new Artist(name, nationality) 簡化Artist::new //String[]::new Stream<String> trs = Arrays.stream(person).map(Person::getName); } /** * Optional */ @Test(expected = NullPointerException.class) public void test3(){ String str = ""; Assert.assertFalse(Optional.ofNullable(str).isEmpty()); Assert.assertTrue(Optional.ofNullable(null).isEmpty()); Assert.assertTrue(Optional.empty().isEmpty()); Assert.assertEquals("你",Optional.of("你").get()); Assert.assertEquals("你",Optional.ofNullable("你").get()); Assert.assertEquals("你",Optional.ofNullable("你").orElse("他")); Assert.assertEquals("他",Optional.ofNullable(null).orElse("他")); Assert.assertEquals("他",Optional.ofNullable(null).orElseGet(()->"他")); Assert.assertEquals("他",Optional.ofNullable(null).orElseThrow(()-> new NullPointerException("空指針異常"))); Assert.assertFalse(Optional.ofNullable(null).isPresent()); //Assert.assertFalse(Optional.ofNullable(null).ifPresentOrElse();); } }