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();); } }