Java8新特性——內建的功能性介面
阿新 • • 發佈:2018-12-09
轉載自:http://blog.csdn.net/gdouchufu/article/details/29235975,由於是轉載,就什麼也不改了.謝謝博主分享!
今天是高考的日子,是大四師兄師姐答辯畢業的日子。一代又來,一代又去。好久沒寫部落格,藉此特殊日子整理一下前不久學java8新特性時寫的程式碼,留下痕跡。(本部落格的程式碼根據 java8新特性教程 學習整理,加上個人的理解而成,關於某個新特性的介紹程式碼裡的註釋已經闡述清楚,故不再寫文字介紹,直接看程式碼吧!)
本篇介紹java8的新特性之一:內建的功能性介面。
這些常用的內建功能性介面包括:斷言介面(Predicates)、功能介面(Functions)、供應介面(Suppliers)、消費介面(Consumers)、比較介面(Comparators)、選項介面(Optionals)。
1. 先定義一個JavaBean以作測試用:
[java] view plain copy
- public class Person {
- public String firstName;
- public String lastName;
- public Person() {}
-
- public Person(String firstName, String lastName) {
- this.firstName = firstName;
- this.lastName = lastName;
- }
- }
2. 測試各個介面的作用:
[java] view plain copy
- 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<String> 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<String> isEmpty = String::isEmpty;
- Predicate<String> isNotEmpty = isEmpty.negate();
- System.err.println(isEmpty.test("sfasdfsa")); //false
- System.err.println(isNotEmpty.test("sfasdfsa")); //true
- }
- /**
- * 功能介面(Functions)
- * Functions接受一個引數併產生一個結果。預設方法能夠用於將多個函式連結在一起。
- */
- @Test
- public void Function(){
- Function<String, Integer> toInteger = Integer::valueOf;//(str) -> Integer.valueOf(str);
- Function<String, String> backToString = toInteger.andThen(String::valueOf);
- System.err.println(backToString.apply("123")); // "123"
- }
- /**
- * 供應介面(Suppliers)
- * Suppliers對於給定的泛型型別產生一個例項。不同於Functions,Suppliers不需要任何引數。
- */
- @Test
- public void Supplier(){
- Supplier<Person> supplier = Person::new;
- Person p = supplier.get();
- System.err.println(p);
- }
- /**
- * 消費介面(Consumers)
- Consumers代表在只有一個輸入引數時操作被如何執行。
- */
- @Test
- public void Consumers(){
- Consumer<Person> greeter = (p) -> System.err.println("Hello, "+p.firstName);
- greeter.accept(new Person("Lee","xx"));
- }
- /**
- * 比較介面(Comparators)
- Comparators在老版本中就已經被熟知。Java8向該介面中添加了多種預設方法。
- */
- @Test
- public void Comparator(){
- Comparator<Person> 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<String> 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+"----------"));
- }
- }