1. 程式人生 > >Java8新特性(二)方法引用

Java8新特性(二)方法引用

方法引用

方法引用其實就是Lambda表示式的簡寫,標誌是 ::

1、和Lambda表示式比較

public class Java8Test {
    public static void main(String[] args) {
        //lambda表示式
        TestUser test1 = () -> new User();
        //方法引用
        TestUser test2 = User::new;
    }
}
class User{

    private String name;

    public
String getName() { return name; } public void setName(String name) { this.name = name; } } interface TestUser{ User get(); }

2、簡單應用


public class Java8Test {
    public static void main(String[] args) {
        User user = UserFactory.createUser(User::new);
    }
}
class UserFactory{

    public
static User createUser(TestUser test){ return test.get(); } }

3、JDK 的 java.util.function包

在JDK8中新定義新加了java.util.function的包,方便我們使用方法引用

這裡寫圖片描述

4、方法使用四種使用方式

4.1、類名::new

public class Java8Test {
    public static void main(String[] args) {
        User user1 = UserFactory.createUser1(User::new
); User user2 = UserFactory.createUser2(User::new); } } interface TestUser{ User get(); } class UserFactory{ public static User createUser1(TestUser test){ return test.get(); } //Supplier介面JDK1.8實現和我TestUser實現類似 public static User createUser2(Supplier<User> supplier){ return supplier.get(); } }
4.2、類名::靜態方法
//初始化引數
@org.junit.Test
public void test1(){
    //初始化引數
    List<User> list = new ArrayList<>();
    User user1 = new User();
    user1.setName("張三");
    User user2 = new User();
    user2.setName("王五");
    list.add(user1);
    list.add(user2);


    //jdk的forEach實現
    list.forEach(UserFactory::point);
    //自定義forEach實現
    Factory factory = new Factory();
    factory.list = list;
    factory.forEach(UserFactory::point);
}

class Factory{

    public List<User> list = new ArrayList<>();

    public void forEach(MyConsumer<User> consumer){
        for (User user : list){
            //執行方法,1.8自動幫你實現,註釋掉就不會執行方法
            consumer.accept(user);
        }
    }

}
interface MyConsumer<T> {

    public void accept(T t);
}
class UserFactory{
    public static User point(User user){
        System.out.println("姓名:"+user.getName());
        return user;
    }
}

這裡有一個易疏漏的點,在自定義的MyConsumer的accept方法有什麼用?
這方法是方法引用的程式碼執行塊。

執行結果:
這裡寫圖片描述

註釋掉accept方法
這裡寫圖片描述

4.3、類名::方法
@org.junit.Test
public void test2(){
    //初始化引數
    List<User> list = new ArrayList<>();
    User user1 = new User();
    user1.setName("張三");
    User user2 = new User();
    user2.setName("王五");
    list.add(user1);
    list.add(user2);

    list.forEach(User::getName);
}
class User{

    private String name;

    public String getName() {
        System.out.println(name);
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

列印結果:
這裡寫圖片描述

4.4、例項後::方法名
@org.junit.Test
public void test3(){
    //初始化引數
    List<User> list = new ArrayList<>();
    User user1 = new User();
    user1.setName("張三");
    User user2 = new User();
    user2.setName("王五");
    list.add(user1);

    User user = UserFactory.createUser1(User::new);
    user.setName("李四");
    list.forEach(user::getName);
}
class User{

    private String name;
    /*
    public String getName() {
        System.out.println(name);
        return name;
    }*/

    public void getName(User user) {
        System.out.println(user.name);
    }

    public void setName(String name) {
        this.name = name;
    }
}

列印結果:
這裡寫圖片描述

相關推薦

Java8特性方法引用

方法引用 方法引用其實就是Lambda表示式的簡寫,標誌是 :: 1、和Lambda表示式比較 public class Java8Test { public s

Java8特性方法引用、構造器引用、陣列引用

目錄: 1、方法引用 1.1、物件 :: 例項方法 1.2、類 :: 靜態方法 1.3、類 ::例項方法 2、構造器引用 2.1、介紹 2.2、使用 3、陣列引用 3.1、介紹 3.2、使用 1、方法引用 若lambda體中的內容有方法已經實現了,

Java8特性方法引用

輸出結果 知識 public ava urn strong class rules ros   上一節介紹了Java8新特性中的Lambda表達式,本小節繼續講解Java8的新特性之二:方法引用。方法引用其實也離不開Lambda表達式。 1、方法引用的使用場景   我們

Java8特性

四大內建核心函式式介面 Java8 內建的四大核心函式式介面 Consumer : 消費型介面 --> void accept(T t); Supplier : 供給型介面 -->T get(); Function<T, R> : 函式型介

Java8特性------介面中可以定義方法

 Java8比起以前的版本存在很大的變化,我們知道在之前的版本中介面只能是定義抽象的方法,是不能定義實現的,但是在java8環境下,這個不可能已經變得可能。下面我們通過例子一步一步的來講解下java8

java8方法引用

方法引用讓你可以重複使用現有的方法定義,並像 Lambda 一樣進行傳遞。 方法引用可以被看作僅僅呼叫特定方法的 Lambda 的一種快捷寫法。 事實上,方法引用就是讓你根據已有的方法實現來建立 Lambda 表示式。 例: @Test public void test1() { Chat chat

Java8特性---Lambda表示式

Java8新特性之Lambda表示式 Lambda的語法格式 語法格式一:無引數,無返回值 語法格式二:有一個引數,並且無返回值 語法格式三:若只有一個引

php7特性:面向物件部分

1)、PHP 7 支援new class 來例項化一個匿名類這可以用來替代一些"用後即焚"的完整類定義。 2)、Closure::call():將一個閉包函式動態繫結到一個新的物件例項並呼叫執行該函式 3)、use:可以使用一個 use 從同一個 namespace 中匯入類、函

Java8特性日期時間的API

1、新時間日期API java.time – 包含值物件的基礎包 java.time.chrono – 提供對不同的日曆系統的訪問 java.time.format – 格式化和解析時間和日期 java.time.temporal – 包括底層框架和擴

JDK1.8特性Lambda表示式入門

lambda表示式本質是匿名方法,下面是一些lambda表示式: (int x, int y) -> x + y () -> 42 (String s) -> { System.out.println(s); } 第一個lambda表示式接收x和y這兩個整形引

java8特性:Stream流的使用

Java5的時候就引入了自動裝箱拆箱的功能, 在對包裝型別進行數學計算的時候,包裝型別就會被自動拆箱成基本型別, 而將一個基本型別的值賦值給一個包裝型別的變數或者放入集合中時基本型別又會被自動裝箱成包裝型別,這個過程是需要消耗計算效能的。Java8的包裝型別的流的計算過程中同樣包含了對基本型別的自動裝箱和拆箱

java8新增特性----函式式介面Functional

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

kubernetes1.5特性:支援Photon卷外掛

在Kubernetes中卷的作用在於提供給POD持久化儲存,這些持久化儲存可以掛載到POD中的容器上,進而

java8特性方法引用、構造器引用

前言: 接上一篇文章:Java8新特性(內建的核心函式式介面)http://blog.csdn.net/xinghuo0007/article/details/78603908 我們知道使用了L

java8特性 λ、stream 與 預設介面方法

1.lambda λ表示式本質上是一個匿名方法,用來方便地實現函式介面。也就是說,λ表示式主要用於替換以前廣泛使用的內部匿名類。  讓我們來看下面這個例子:     public int add(int x, int y) {         return x + y;  

Java8特性

並行流與序列流 什麼是並行流 我們先了解一下什麼是Fork/Join框架 Fork/Join框架和傳統的執行緒池的區別 應用Fork/Join計算100000000的和: public class ForkJoinCalculate extends

Java8特性

強大的Stream API 瞭解Stream Java8中有兩個最為重要的改變。第一個是Lambda表示式;另外一個則是Stream API(java.util.stream.*)。 Stream是Java8中處理集合的關鍵抽象概念,它可以指定你希望對集合進行的操作,可以執行非常複雜

java8特性簡述十大特性

截止稿前,java10都已經發布了,現在我們來討論一下java8(2014年3月釋出)。 本文的討論,只是一個簡述,更加具體的,各位可以參照各自的專題講解 說在前面 你真的開始用JDK8了嗎? 如果你沒有用上一些新特性,請別說自己使用了Java8。 Java 8可謂

C# 7.0 特性2: 本地方法

本文參考Roslyn專案中的Issue:#259. 簡而言之,【本地方法】就是在方法體內部定義一個方法。 其實咋眼一看,這個新特新並沒有什麼新意,因為目前大量C#的專案中,都可以使用delegate或基於delegate變形的各種方案(lambda, Fun,

C# 7.0 特性1: 基於Tuple的“多”返回值方法

本文基於Roslyn專案中的Issue:#347 展開討論. 回顧 首先,提出一個問題,C#中,如何使一個方法可返回”多個”返回值? 我們先來回顧一下C#6.0 及更早版本的做法。 在C#中,通常我們有以下4種方式使一個方法返回多條資料。 使用 KeyVal