1. 程式人生 > >jdk8特性例子 內建函式式介面

jdk8特性例子 內建函式式介面

       Lambda 表示式是如何在java的型別系統中表示的呢?每一個lambda表示式都對應一個型別,通常是介面型別。而“函式式介面”是指僅僅只包含一個抽象方法的 介面,每一個該型別的lambda表示式都會被匹配到這個抽象方法。因為 預設方法 不算抽象方法,所以你也可以給你的函式式介面新增預設方法。

       我們可以將lambda表示式當作任意只包含一個抽象方法的介面型別,確保你的介面一定達到這個要求,你只需要給你的介面新增 @FunctionalInterface 註解,編譯器如果發現你標註了這個註解的介面有多於一個抽象方法的時候會報錯的。


Predicates

Predicates are boolean-valued functions of one argument. The interface contains various default methods for composing predicates to complex logical terms (and, or, negate)

謂詞

謂詞是隻有一個引數的布林型函式。這個介面包含不同的預設方法,將謂片語成複雜的邏輯組合。

public class PredicateTest {
	public static void main(String[] args) {
		Predicate<String> predicate = (s) -> s.length() > 0;

		// 檢查給定引數的謂詞
		Boolean a = predicate.test("foo"); // true
		// 邏輯上相反的謂詞
		Boolean b = predicate.negate().test("foo"); // false

		// 引用靜態方法
		Predicate<Boolean> nonNull = Objects::nonNull;
		Predicate<Boolean> isNull = Objects::isNull;

		System.out.println(nonNull.test(null)); // false
		System.out.println(isNull.test(null)); // true

		// 引用普通方法
		Predicate<String> isEmpty = String::isEmpty;
		Predicate<String> isNotEmpty = isEmpty.negate();

		System.out.println(isEmpty.test("")); // true
		System.out.println(isNotEmpty.test("")); // false
	}
}

Functions

Functions accept one argument and produce a result. Default methods can be used to chain multiple functions together (compose, andThen).

將Function物件應用到輸入的引數上,然後返回計算結果

public class FunctionTest {
public static void main(String[] args) {


// toInteger 稱作函式物件
// 表示一個方法,接受一個引數,產生一個結果;第一個是入參,第二個是結果
Function<String, Integer> toInteger = Integer::valueOf;


// 返回一個先執行當前函式物件apply方法再執行after函式物件apply方法的函式物件。
Function<String, String> backToString = toInteger.andThen(String::valueOf);


backToString.apply("123"); // "123"


// 這個函式式介面的函式方法是apply, 把函式應用在指定的引數上
// 如果你想把接受一些輸入引數並將對輸入引數處理過後的結果返回的功能封裝到一個方法內,Function介面是一個不錯的選擇
System.out.println(toInteger.apply("123"));

Function<String, Integer> f1 = (t) -> Integer.valueOf(t) * 10;  
System.out.println(f1.apply("3")); // 30 

// 返回自身
System.out.println(Function.identity().apply("3"));   // 3

// 先執行 apply 在執行andThen
System.out.println(f1.andThen((r) -> String.valueOf(r) + ".....").apply("4"));  // 40..... 

// 先執行compose裡面的函式 再執行本函式的apply
System.out.println(f1.compose((String r) -> r.substring(1)).apply("a5"));  
}
}

Suppliers

Suppliers produce a result of a given generic type. Unlike Functions, Suppliers don't accept arguments.

supplier 產生指定型別的一個結果。不同於function,supplier 不接受引數。 類似 一個使用預設構造器的工廠方法。

public class SupplierTest {
	public static void main(String[] args) {
		Supplier<Person> personSupplier = Person::new;
		Person persion = personSupplier.get(); // new Person
		System.out.println(persion); // Person [firstName=null, lastName=null]
	}
}

Consumers

Consumers represents operations to be performed on a single input argument.

consumer 表示作用在一個入參上的操作,沒有返回值。例子 (星球大戰)

public class ConsumerTest {
	public static void main(String[] args) {
		Consumer<Person> greeter = (p) -> System.out.println("Hello, " + p.firstName);
		greeter.accept(new Person("Luke", "Skywalker"));
	}
}

Comparators

Comparators are well known from older versions of Java. Java 8 adds various default methods to the interface.

public class ComparatorTest {
	public static void test() {
		List<String> names = Arrays.asList("peter", "anna", "mike", "xenia");

		Collections.sort(names, new Comparator<String>() {
			@Override
			public int compare(String a, String b) {
				return b.compareTo(a);
			}
		});

		Collections.sort(names, (String a, String b) -> {
			return b.compareTo(a);
		});

		Collections.sort(names, (String a, String b) -> b.compareTo(a));

		Comparator<Person> comparator = (p1, p2) -> p1.firstName.compareTo(p2.firstName);

		Person p1 = new Person("John", "Doe");
		Person p2 = new Person("Alice", "Wonderland");

		comparator.compare(p1, p2); // > 0
		comparator.reversed().compare(p1, p2); // < 0
	}
}


Optional 看上去沒什麼用,和NPE相關的。參考 http://www.oracle.com/technetwork/articles/java/java8-optional-2175753.html

Optional 不是函式是介面,這是個用來防止NullPointerException異常的輔助型別,這是下一屆中將要用到的重要概念,現在先簡單的看看這個介面能幹什麼:

Optional 被定義為一個簡單的容器,其值可能是null或者不是null。在Java 8之前一般某個函式應該返回非空物件但是偶爾卻可能返回了null,而在Java 8中,不推薦你返回null而是返回Optional。

Optional<String> optional = Optional.of("bam");

optional.isPresent();           // true
optional.get();                 // "bam"
optional.orElse("fallback");    // "bam"

optional.ifPresent((s) -> System.out.println(s.charAt(0)));     // "b"


相關推薦

jdk8特性例子 式式介面

       Lambda 表示式是如何在java的型別系統中表示的呢?每一個lambda表示式都對應一個型別,通常是介面型別。而“函式式介面”是指僅僅只包含一個抽象方法的 介面,每一個該型別的lambda表示式都會被匹配到這個抽象方法。因為 預設方法 不算抽象方法,所以

Java——Lambda表示式、方法引用及式式介面

1.Lambda表示式 面向物件的基礎上支援函數語言程式設計 1.1 約束: 介面有且僅有一個抽象方法,如果存在兩個抽象方法,則無法使用函數語言程式設計。 介面有且僅有一個抽象方法,且想要轉化為lambda表示式,加註解 @FunctionalInterface

Lambda表示式式式介面

import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.functio

JDK8特性-lambda表示式,式式介面

1. String.join /** * Returns a new String composed of copies of the * {@code CharSequence elements} joined together with a co

JAVA8新特性-Lambda表示式、式式介面以及方法引用

  一、Lembda表示式 關於Lambda表示式,首先我們要知道Lambda表示式是什麼?為什麼要用?在什麼情況下要用? what:Lambda 是一個匿名函式,我們可以把 Lambda 表示式理解為是一段可以傳遞的程式碼(將程式碼 像資料一樣進行傳遞)。 why:可以寫

Java8新特性Lambda表示式、式式介面

什麼是Lambda表示式,java8為什麼使用Lambda表示式? “Lambda 表示式”(lambda expression)是一個匿名函式,Lambda表示式基於數學中的λ演算得名,直接對應於其中的lambda抽象(lambda abstraction)

java8新增特性(二)----式式介面(Functional)

     上一篇部落格介紹了java8新增的Lambda表示式,這一節介紹一下java8的函數語言程式設計,兩者之間有什麼聯絡呢?請往下看~~~      Lambda表示式如何在java型別中表示的呢?      語言設計者投入了大量的精力來思考如何使現有的函式友好地支

/*Java8的四大核心式式介面

package com.greatest.Java8; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.function.Consumer; import ja

jdk8特性:Lambda表示式(也稱為閉包、可傳遞的匿名函式)與式式介面@FunctionalInterface

  1) 一個lambda可以由用逗號分隔的引數列表、–>符號與函式體三部分表示。例如: ex.1 Arrays.asList( "a", "b", "d" ).forEach( e -> System.out.println( e ) ); ex.2  (

JDK8 lambda表示式 及四大內核心式式介面

package com.hundsun.java.se.java8;   import org.junit.Test;   import java.util.Comparator; import java.util.function.Consumer;

JDK8特性學習(一) Lambda表示式和式式介面

Lambda表示式和函式式介面 剛進公司時,公司正處於由JDK7換用JDK8的時間短,之所以更換JDK版本,聽說是公司業務中需要用到JDK8的一些新特性。鑑於我現在也無事可做,姑且來學習總結一下JDK8的一些特性吧。水平有限,這篇勉強算是對他人部落格上零

JDK8特性式式介面@FunctionalInterface的使用說明

我們常用的一些介面Callable、Runnable、Comparator等在JDK8中都添加了@FunctionalInterface註解。 通過JDK8原始碼javadoc,可以知道這個註解有以下特點: 1、該註解只能標記在"有且僅有一個抽象方法"的介面上。 2、JDK8介面中的靜

JDK8特性式式介面

什麼是函式式介面 先來看看傳統的建立執行緒是怎麼寫的 Thread t1 = new Thread(new Runnable() { @Override public void run() { System.out.pri

式式介面@FunctionalInterface學習(函式程式設計思想)------------與匿名部類對比

 在java8中 1、新推出了一個介面概念:函式式介面。 2、允許介面也可以有default方法,default方法可以方法體。 他滿足以下規範: 介面有且只能有個一個抽象方法(抽象方法只有方法定義,沒有方法體) 不能在介面中覆寫Object類中的publi

Java8新特性——的功能性介面

轉載自:http://blog.csdn.net/gdouchufu/article/details/29235975,由於是轉載,就什麼也不改了.謝謝博主分享! 今天是高考的日子,是大四師兄師姐答辯畢業的日子。一代又來,一代又去。好久沒寫部落格,藉此特殊日子整理一下前不久學java8新特性

java8新特性式式介面

雖然剛釋出了java11版本,但是對於java8中新的特性我們仍需要掌握,畢竟大部分開發都是用的jdk8,以及java11中仍然保留著這些特性,接下來我就網上查詢資料做了一下總結,如果哪裡說的不對頭,還請各位大佬指出來,我會及時更正。 1.函式式介面定義: 那麼函式介面到

Java8新特性:Lambda表示式和式式介面

Java8新特性:速度更快,程式碼更少,stream API,便於並行,最大化減少空指標異常:Optional Lambda表示式 好處: Lambda是一個匿名函式,可以把lambda表示式理解為一

JDK8式式介面Function、Consumer、Predicate、Supplier

備註1:觀察發現,函式式介面下共有 1、三種方法 1.1 唯一的抽象方法 1.2 使用default定義普通方法(預設方法),通過物件呼叫。 實現介面後,因為預設方法不是抽象方法,所以可以不重寫,但是如果開發需要,也可以重寫 。當然如果介面中

jdk1.8新特性 式式介面

函式式介面    1、只包含一個抽象方法的介面,稱為函式式介面。    2、你可以通過Lambda 表示式來建立該介面的物件。(若Lambda 表示式丟擲一個受檢異常,那麼該異常需要在目標介面的抽象方法上進行宣告)。    3、我們可以在任意函式式介面上使用@Function

java8中幾個式式介面的小例子

// Function<T, R> -T作為輸入,返回的R作為輸出 Function<String,String> function = (x) -> {System.out.print(x+": ");return "Function"