摘要:引用特定類型的方法特定類普通方法引用構(gòu)造方法類名稱引用構(gòu)造方法內(nèi)建函數(shù)式接口方法引用操作可能出現(xiàn)的函數(shù)式接口有四類有參數(shù)有返回值有參數(shù)無返回值無參數(shù)有返回值判斷真假。
可變參數(shù)
在java程序中調(diào)用方法時,必須嚴(yán)格按照方法定義的變量進(jìn)行參數(shù)傳遞。但是在開發(fā)過程中可能會出現(xiàn)一種情況:不確定要傳遞的參數(shù)個數(shù)。解決這個問題的思路是將多個參數(shù)封裝為數(shù)組。這是一個打折扣的方法,因?yàn)閿?shù)組并不代表任意多個數(shù)據(jù)。
在JDK1.5中,引入了可變參數(shù)的概念??勺儏?shù)的語法形式為:
[public/protected/private] [static/final/abstract] 返回值類型 func(參數(shù)類型 ... 變量){ [return [返回值] ;] }
參數(shù)變量傳遞到方法中,以指定類型的數(shù)組進(jìn)行保存。
public class varargs{ public static void main(String args[]){ System.out.println(add(1,2,3)); System.out.println(add(10,20)); } public static int add(int ... data){ int sum = 0; for(int i = 0; i < data.length; i++){ sum += data[i]; } return sum; } }foreach循環(huán)
java中的foreach語句是一種加強(qiáng)型for循環(huán)操作。for循環(huán)的輸出方式需要控制索引,過于麻煩。因此,在JDK1.5中引入foreach形式。
for(數(shù)據(jù)類型 變量:數(shù)組/集合){ //每一次循環(huán),會將數(shù)組內(nèi)容賦值個變量 }
每次循環(huán)自動將數(shù)組或集合的內(nèi)容取出,避免了索引問題。
public class foreach{ public static void main(String args[]){ int data[] = new int[]{1,2,3,4,5}; for(int x : data){ System.out.println(x + " "); } }靜態(tài)導(dǎo)入
如果一個類中的方法全部屬于static型方法,其他類在引用此類時,必須先使用import導(dǎo)入所需要的包。然后使用“類名.方法()”進(jìn)行調(diào)用。
如果在調(diào)用這些方法時不希望出現(xiàn)類的名稱,JDK1.5引入靜態(tài)導(dǎo)入功能。
import static 包.類.*;
package com.qi.demo; public class myMath{ public static int div(int x, int y) throws Exception{ System.out.println("===start==="); int result = 0; try{ result = x / y; }catch(Exception e){ throw e; }finally{ System.out.println("===end==="); } return result; } public static int add(int x, int y){ return x + y; } }
import static com.qi.demo.myMath.*; public class static_import{ public static void main(String args[]){ System.out.println("Add operation:" + add(10,20)); try{ System.out.println("divide operation: " + div(10,2)); }catch(Exception e){ e.printStackTrace(); } } }
靜態(tài)導(dǎo)入可以減少代碼量,但是過多的靜態(tài)導(dǎo)入會降低代碼的可讀性。
泛型JDk5提供泛型技術(shù)。類屬性或方法的參數(shù)在定義數(shù)據(jù)類型時,可以直接使用一個標(biāo)記進(jìn)行占位,再具體使用時才設(shè)置其對應(yīng)的實(shí)際數(shù)據(jù)類型。這樣當(dāng)設(shè)置的數(shù)據(jù)類型出現(xiàn)錯誤后,就可以在程序編譯時檢測出來。使用泛型時,能夠采用的類型只能是類,也就是說不能是基本類型,只能是引用類型。例如泛型采用整型,應(yīng)用Integer,而不是int。
class Point{ private T x; private T y; public void setX(T x){ this.x = x; } public void setY(T y){ this.y = y; } public T getX(){ return x; } public T getY(){ return y; } }
public class generic{ public static void main(String args[]){ Point通配符p = new Point<>(); p.setX(10); p.setY(20); Integer x = p.getX(); Integer y = p.getY(); System.out.println("coordinate x: " + x + " y: " +y); } }
對于同一類,由于設(shè)置泛型類型不同,其對象表示的含義也不同,因此不能夠直接進(jìn)行引用操作。例如通過泛型定義Message
class Message{ private T msg; public void setMsg(T msg){ this.msg = msg; } public T getMsg(){ return msg; } } public class generic_wildcard{ public static void main(String args[]){ Message m1 = new Message<>(); Message m2 = new Message<>(); m1.setMsg(100); m2.setMsg("hello"); fun(m1); fun(m2); } public static void fun(Message> temp){ System.out.println(temp.getMsg()); } }
在“?”通配符的基礎(chǔ)上還有兩個子通配符。
? extends 類
設(shè)置泛型上限,在聲明和方法中使用。表示可以設(shè)置該類或其子類。
? super 類
設(shè)置泛型下限,在方法中使用。表示只能設(shè)置該類或其父類。
泛型接口泛型可以定義在接口上。使用接口必須定義相應(yīng)子類。對于使用泛型的接口,有兩種實(shí)現(xiàn)方式。一是在子類繼續(xù)設(shè)置泛型標(biāo)記。二是在子類中為父類接口明確定義一個泛型類型。
泛型方法泛型也可以在方法中定義。在方法中定義泛型時,方法不一定要在泛型類中定義,但要在方法返回值類型前明確定義泛型類型。
AnnotationJDK1.5提出并應(yīng)用了注解技術(shù)。在java SE中,最常見的Annotation是:
@Override
準(zhǔn)確覆寫操作。保證子類覆寫的方法是父類中定義過的方法。當(dāng)覆寫方法出現(xiàn)錯誤時,可以在編譯時檢查出來。
@Deprecated
聲明過期操作。用于聲明過期不建議使用的方法。
@SuppressWarnings
壓制警告。開發(fā)者明確知道會出現(xiàn)警告信息卻執(zhí)意按照固定方式處理,可以使用@SuppressWarnings壓制出現(xiàn)的警告信息。
class Book接口定義加強(qiáng){ private T title; public void setTitle(T title){ this.title = title; } public T getTitle(){ return title; } } public class annotation_suppresswarnings{ @SuppressWarnings({"rawtypes", "unchecked"}) public static void main(String args[]){ Book book = new Book(); book.setTitle("hello"); System.out.println(book.getTitle()); } }
JDK1.8開始,接口中可以定義普通方法與靜態(tài)方法。java增加這個特性原因如下。隨著接口的子類越來越多,如果這個接口功能不足,需要增加新的方法,則需要對所有接口子類覆寫新增加的方法。這個設(shè)計(jì)的工作量是重復(fù)的且是巨大的,因此通過放寬接口定義,接口可以定義普通方法和靜態(tài)方法,接口的方法擴(kuò)充問題就能得到很好的解決。
在接口中定義普通方法,該方法必須使用default來進(jìn)行定義。使用default定義的普通方法,需要利用實(shí)例化對象明確調(diào)用。在接口中定義靜態(tài)方法,該方法可以由接口名稱直接調(diào)用。
JDK1.8中引入lambda表達(dá)式。lambda表達(dá)式是應(yīng)用在單一抽象方法接口環(huán)境下的一種簡化定義形式,解決匿名內(nèi)部類定義復(fù)雜問題。單一抽象方法接口使用@FunctionalInterface注解,表示此為函數(shù)式接口,里面只允許定義一個抽象方法。lambda表達(dá)式有三種形式。
(params) -> expression
(params) -> statement
(params) -> {statements}
@FunctionalInterface interface IMessage{ public int add(int ... args); static int sum(int ... args){ int sum = 0; for(int temp:args){ sum += temp; } return sum; } } public class lambda{ public static void main(String args[]){ //()內(nèi)是參數(shù),->后是子類覆寫抽象方法的方法體 fun((int ... param) -> IMessage.sum(param)); } public static void fun(IMessage msg){ System.out.println(msg.add(10,20,30)); } }方法引用
JDK1.8支持方法的引用操作,相當(dāng)于為方法定義別名。java8定義了四種方法引用操作形式。
引用靜態(tài)方法
類名稱::static方法名稱
interface Imessage{ public R change(P p); } public class method_reference_static{ public static void main(String args[]){ //將String.valueOf()方法變?yōu)镮Message接口的change()方法 //valueOf()方法接收int型數(shù)據(jù),返回String型數(shù)據(jù) Imessage
msg = String::valueOf; String str = msg.change(1000); System.out.println(str.replaceAll("0","9")); } }
引用某個對象的方法
實(shí)例化對象::普通方法
@FunctionalInterface interface IMessage{ public R upper(); } public class method_reference_common{ public static void main(String args[]){ //String類的toUpperCase()定義:public String toUpperCase()。 //該方法沒有參數(shù),有返回值。 IMessage msg = "hello"::toUpperCase; String str = msg.upper(); System.out.println(str); } }
引用特定類型的方法
特定類::普通方法
@FunctionalInterface interface IMessage{ public int compare(P p1, P p2); } public class method_reference_special{ public static void main(String args[]){ IMessage
msg = String::compareTo; System.out.println(msg.compare("A","B")); } }
引用構(gòu)造方法
類名稱::new
@FunctionalInterface interface IMessage內(nèi)建函數(shù)式接口{ public C create(String t, double p); } class Book{ private String title; private double price; public Book(String title, double price){ this.title = title; this.price = price; } @Override public String toString(){ return "book: " + this.title + ", price: " + this.price; } } public class metheod_reference_constructor{ public static void main(String args[]){ IMessage msg = Book::new; //引用構(gòu)造方法 Book book = msg.create("JAVA", 100); System.out.println(book); } }
方法引用操作可能出現(xiàn)的函數(shù)式接口有四類:有參數(shù)有返回值、有參數(shù)無返回值、無參數(shù)有返回值、判斷真假。JDK1.8提供了一個新的開發(fā)包:
java.util.function
該開發(fā)包提供四個核心函數(shù)式接口,簡化開發(fā)者的定義,實(shí)現(xiàn)操作的統(tǒng)一。
1、功能型接口
@FunctionalInterface public interface Function{ public R apply(T t); //接收**一個**參數(shù),并返回一個處理結(jié)果 }
import java.util.function.Function; public class funcifc_function{ public static void main(String args[]){ Functionfun = "##hello"::startsWith; //利用對象調(diào)用startsWith() System.out.println(fun.apply("##")); } }
注意引用的方法只能有一個輸入和一個返回結(jié)果。否則,引用方法不能與apply()匹配。
2、消費(fèi)型接口
@FunctionalInterface public interface Comsumer{ public void accept(T t); //只接收數(shù)據(jù),不返回結(jié)果 }
import java.util.function.Consumer; public class funcifc_consumer{ public static void main(String[] args){ Consumercons = System.out::print; cons.accept("hello world"); } }
3、供給型接口
@FunctionalInterface public interface Supplier{ public T get(); //不接收數(shù)據(jù),只返回結(jié)果 }
import java.util.function.Supplier; public class funcifc_supplier{ public static void main(String args[]){ Suppliersup = "hello"::toUpperCase; System.out.println(sup.get()); } }
4、斷言型接口
@FunctionalInterface public intereface Predicate{ public boolean test(T t); //判斷 }
import java.util.function.Predicate; public class funcifc_predicate{ public static void main(String args[]){ Predicatepre = "hello"::equalsIgnoreCase; System.out.println(pre.test("HELLO")); } }
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/76937.html
摘要:把對象定義為無序?qū)傩缘募?,其屬性可以包含基本值對象或函?shù)。接受兩個參數(shù)屬性所在的對象和要讀取其特性的屬性名返回的時其特性的對象例如讀高級程序設(shè)計(jì)這本書的第章面向?qū)ο蟮某绦蛟O(shè)計(jì),我做了篇筆記。這是第一篇,后面還有兩篇,分別是封裝類和繼承。 ECMA-262把對象定義為:無序?qū)傩缘募?,其屬性可以包含基本值、對象或函?shù)。所以,我們可以理解對象就是名值對的集合,名就是對象的每個屬性的名字,...
摘要:面向?qū)ο蟮某绦蛟O(shè)計(jì)理解對象前言最近在細(xì)讀高級程序設(shè)計(jì),對于我而言,中文版,書中很多地方翻譯的差強(qiáng)人意,所以用自己所理解的,嘗試解讀下??偨Y(jié)如果英語水平足夠好的話,建議看英文原版書籍或者國外大師的博客。 JS面向?qū)ο蟮某绦蛟O(shè)計(jì)_理解對象 前言:最近在細(xì)讀Javascript高級程序設(shè)計(jì),對于我而言,中文版,書中很多地方翻譯的差強(qiáng)人意,所以用自己所理解的,嘗試解讀下。 如有紕漏或錯誤,會非...
摘要:對象是由多個名值對組成的無序的集合。對象中每個屬性對應(yīng)任意類型的值。目標(biāo)屬性所擁有的特性返回值傳入函數(shù)的對象。給對象的屬性添加特性描述,目前提供兩種形式數(shù)據(jù)描述和存取器描述。兼容性在下只能在對象上使用,嘗試在原生的對象使用會報錯。 對象是由多個名/值對組成的無序的集合。對象中每個屬性對應(yīng)任意類型的值。定義對象可以使用構(gòu)造函數(shù)或字面量的形式: var obj = new Object; ...
摘要:摘要是一種為了管理復(fù)制日志的一致性算法。接下來,這篇論文會介紹以下內(nèi)容復(fù)制狀態(tài)機(jī)問題第節(jié),討論的優(yōu)點(diǎn)和缺點(diǎn)第節(jié),討論我們?yōu)榱丝衫斫庑远扇〉姆椒ǖ诠?jié),闡述一致性算法第節(jié),評價算法第節(jié),以及一些相關(guān)的工作第節(jié)。 摘要 Raft 是一種為了管理復(fù)制日志的一致性算法。它提供了和 Paxos 算法相同的功能和性能,但是它的算法結(jié)構(gòu)和 Paxos 不同,使得 Raft 算法更加容易理解并且更容易...
閱讀 910·2021-09-03 10:42
閱讀 1521·2019-08-30 15:56
閱讀 1457·2019-08-29 17:27
閱讀 881·2019-08-29 15:25
閱讀 3168·2019-08-26 18:27
閱讀 2490·2019-08-26 13:41
閱讀 1898·2019-08-26 10:39
閱讀 1589·2019-08-23 18:36