欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

JDK8 静态接口方法 默认方法 Optional的使用

程序员文章站 2022-06-08 09:09:11
...
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(););
	}
}

 

JDK8 静态接口方法 默认方法 Optional的使用

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