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 strs = Arrays.stream(person).map(x -> x.getName());
//简化写法
// 可将x -> x.getName() 简化成(类名::方法名)
// (name, nationality) -> new Artist(name, nationality) 简化Artist::new
//String[]::new
Stream 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(););
}
}