Java8新特性——内建的功能性接口

今天是高考的日子,是大四师兄师姐答辩毕业的日子。一代又来,一代又去。好久没写博客,借此特殊日子整理一下前不久学java8新特性时写的代码,留下痕迹。(本博客的代码根据 java8新特性教程 学习整理,加上个人的理解而成,关于某个新特性的介绍代码里的注释已经阐述清楚,故不再写文字介绍,直接看代码吧!)


    本篇介绍java8的新特性之一:内建的功能性接口。    

这些常用的内建功能性接口包括:断言接口(Predicates)、功能接口(Functions)、供应接口(Suppliers)、消费接口(Consumers)、比较接口(Comparators)、选项接口(Optionals)。


1. 先定义一个JavaBean以作测试用:

public class Person {  
    public String firstName;  
    public String lastName;  
  
    public Person() {}  
  
    public Person(String firstName, String lastName) {  
        this.firstName = firstName;  
        this.lastName = lastName;  
    }  
} 

2. 测试各个接口的作用:

import java.util.Comparator;
import java.util.Optional;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.function.Supplier;

import org.junit.Test;

/**
 * 内建的功能性接口
 * 
 * Java8的API也包含了很多新的功能性接口简化你的开发。
 * 一些新的接口是来自非常出名的Google Guava库。
 */
public class InternalFunctionalInterface {
	
	/**
	 * 断言接口(Predicates)
	 * Predicates是只拥有一个参数的Boolean型功能的接口。这个接口拥有多个默认方法用于构成predicates复杂的逻辑术语。
	 */
	@Test
	public void Predicates(){
			
		Predicate predicates = (str) -> str.length()>0;		
		boolean b1 = predicates.test("foo"); //true
		System.err.println(b1);		
		b1 = predicates.negate().test("foo"); //false ,取反
		System.err.println(b1);
		
		Predicate isEmpty = String::isEmpty;
		Predicate isNotEmpty = isEmpty.negate();
		
		System.err.println(isEmpty.test("sfasdfsa")); //false
		System.err.println(isNotEmpty.test("sfasdfsa")); //true
		
	}
	
   /**
	* 功能接口(Functions)
	* Functions接受一个参数并产生一个结果。默认方法能够用于将多个函数链接在一起。
	*/
	@Test
	public void Function(){
		Function toInteger = Integer::valueOf;//(str) -> Integer.valueOf(str);
		Function backToString = toInteger.andThen(String::valueOf);
		
		System.err.println(backToString.apply("123")); // "123"
	}
	
	/**
	 * 供应接口(Suppliers)
	 * Suppliers对于给定的泛型类型产生一个实例。不同于Functions,Suppliers不需要任何参数。
	 */
	@Test
	public void Supplier(){
		Supplier supplier = Person::new;
		Person p = 	supplier.get();
		System.err.println(p);		
	}
	
	/**
	 * 消费接口(Consumers)
		Consumers代表在只有一个输入参数时操作被如何执行。
	 */
	@Test
	public void Consumers(){
		Consumer greeter = (p) -> System.err.println("Hello, "+p.firstName);
		greeter.accept(new Person("Lee","xx"));
	}
	
	/**
	 * 比较接口(Comparators)
		Comparators在老版本中就已经被熟知。Java8向该接口中添加了多种默认方法。
	 */
	@Test
	public void Comparator(){
		Comparator comparator = (p1,p2) -> p1.firstName.compareTo(p2.firstName);
		
		Person p1 = new Person("Lee","bugua");
		Person p2 = new Person("Chen","yueyayun");
		
		System.err.println(comparator.compare(p1, p2)); // 9>0       why is 9????????????????????
		System.err.println(comparator.reversed().compare(p1, p2));; // -9<0 
	}
	
	/**
	 * 选项接口(Optionals)
		Optionals并不是功能性接口,反而它是一种特殊的工具用来阻止NullPointerException。
		我们首先快速的浏览Optionals是如何工作的,因为它在下一章节是十分重要的概念。
		Optional是一种可以包含null和non-null值的简单容器。考虑到方法可以返回non-null结果,偶尔也可能任何都不返回。
		在Java8中,你可以返回Optional而不是返回null。
	 */
	@Test public void Optionals(){
		Optional optional = Optional.of("bam"); //不能为空
		
		System.err.println(optional.isPresent()); // true
		System.err.println(optional.get()); // "bam"
		System.err.println(optional.orElse("fallback"));
		
		optional.ifPresent( (s) -> System.err.println(s+"----------"));
		
	}
}


详情请见这篇博客:  java8新特性教程 

你可能感兴趣的:(Java8新特性)