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

 

JDK8 静态接口方法 默认方法 Optional的使用_第1张图片

转载于:https://my.oschina.net/u/3484671/blog/2995821

你可能感兴趣的:(JDK8 静态接口方法 默认方法 Optional的使用)