JDK8 靜態接口方法 默認方法 Optional的使用

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

 

相關文章
相關標籤/搜索