GP Coder

Trang chia sẻ kiến thức lập trình Java

  • Java Core
    • Basic Java
    • OOP
    • Exception Handling
    • Multi-Thread
    • Java I/O
    • Networking
    • Reflection
    • Collection
    • Java 8
  • Design pattern
    • Creational Pattern
    • Structuaral Pattern
    • Behavior Pattern
  • Web Service
    • SOAP
    • REST
  • JPA
  • Java library
    • Report
    • Json
    • Unit Test
  • Message Queue
    • ActiveMQ
    • RabbitMQ
  • All
Trang chủ Java Core Java 8 Phương thức tham chiếu trong Java 8 – Method References

Phương thức tham chiếu trong Java 8 – Method References

Đăng vào 03/05/2018 . Được đăng bởi GP Coder . 29014 Lượt xem . Toàn màn hình

Nội dung

  • 1 Method References là gì?
  • 2 Các loại Method References

Method References là gì?

Java cung cấp một tính năng mới gọi là Method References (phương thức tham chiếu) trong Java 8.

Method References là một tính năng khá hay và liên quan đến việc sử dụng Lambda Expression. Nó cung cấp các cú pháp (syntax) hữu ích để truy cập trực tiếp tới các constructor hoặc method đã tồn tại của các lớp hoặc đối tượng trong Java mà không cần thực thi chúng. Nó làm cho việc viết code của chúng ta trở nên đơn giản hơn rất nhiều và nhìn chúng đẹp hơn.

Method References là cú pháp viết tắt của biểu thức Lambda để gọi phương thức. Ví dụ, nếu biểu thức Lamda được viết như sau:


str -> System.out.println(str)

Chúng ta có thể viết lại theo cách của Method references như sau:


System.out::println

Java 8 cho phép truyền một tham chiếu của một method hoặc constructor thông qua việc sử dụng từ khóa ::

Các loại Method References

  • Tham chiếu đến một static method – Class::staticMethod
  • Tham chiếu đến một instance method của một đối tượng cụ thể – object::instanceMethod
  • Tham chiếu đến một instance method của một đối tượng tùy ý của một kiểu cụ thể – Class::instanceMethod
  • Tham chiếu đến một constuctor – Class::new

Tham chiếu đến một static method

Cú pháp:


Class::staticMethod

Ví dụ:


package com.gpcoder.method_reference;

@FunctionalInterface
interface ExecuteFunction {
	public int execute(int a, int b);
}

class MathUtils {
	public static int sum(int a, int b) {
		return a + b;
	}

	public static int minus(int a, int b) {
		return a - b;
	}
}

public class DemoMethodReference1 {
	public static void main(String[] args) {
		int a = 10;
		int b = 7;

		int sum = doAction(a, b, MathUtils::sum);
		System.out.println(a + " + " + b + " = " + sum); // 10 + 7 = 17

		int minus = doAction(a, b, MathUtils::minus);
		System.out.println(a + " - " + b + " = " + minus); // 10 - 7 = 3
	}

	public static int doAction(int a, int b, ExecuteFunction func) {
		return func.execute(a, b);
	}
}

Thông qua ví dụ trên, bạn có thể thấy cách thức sử dụng từ khóa :: để truyền vào tham chiếu của một method. Nếu bạn gọi một method, mà trong method đó có một tham số là Functional Interface, bạn có thể truyền vào một tham chiếu method có cấu trúc giống với cấu trúc method định nghĩa trong Functional interface.

Tham chiếu đến một instance method của một đối tượng cụ thể


package com.gpcoder.method_reference;

@FunctionalInterface
interface ExecuteFunction2 {
	public int execute(int a, int b);
}

class MathUtils2 {
	public int sum(int a, int b) {
		return a + b;
	}

	public int minus(int a, int b) {
		return a - b;
	}
}

public class DemoMethodReference2 {
	public static void main(String[] args) {
		int a = 10;
		int b = 7;

		MathUtils2 obj = new MathUtils2();
		int sum = doAction(a, b, obj::sum);
		System.out.println(a + " + " + b + " = " + sum); // 10 + 7 = 17

		int minus = doAction(a, b, obj::minus);
		System.out.println(a + " - " + b + " = " + minus); // 10 - 7 = 3
	}

	public static int doAction(int a, int b, ExecuteFunction2 func) {
		return func.execute(a, b);
	}
}

Như bạn thấy cách sử dụng hoàn toàn tương tự như tham chiếu đến một static method. Bạn chỉ việc khởi tạo một đối tượng cụ thể và sử dụng cú pháp:


object::instanceMethod

Tham chiếu đến một instance method của một đối tượng tùy ý của một kiểu cụ thể

Cú pháp:


Class::instanceMethod

Ví dụ:


package com.gpcoder.method_reference;

import java.util.Arrays;

public class DemoMethodReference3 {
	public static void main(String[] args) {
		String[] stringArray = { "Java", "C++", "PHP", "C#", "Javascript" };

		Arrays.sort(stringArray, String::compareToIgnoreCase);
		for (String str : stringArray) {
			System.out.println(str);
		}
	}
}

Tham chiếu đến một constuctor

Cú pháp:


Class::new

Ví dụ:


package com.gpcoder.method_reference;

@FunctionalInterface
interface SayHello {
	void display(String say);
}

class Hello implements SayHello {
	public Hello(String say) {
		System.out.print(say);
	}

	@Override
	public void display(String say) {
		System.out.println(say);
	}
}

public class DemoMethodReference4 {

	public static void main(String[] args) {
		SayHello ref = Hello::new;
		ref.display("Welcome to gpcoder.com");
	}

}

Như vậy là chúng ta đã tìm hiểu xong một tính năng mới trong Java 8 là Method References. Một vài lưu ý khi về Method References:

  • Chúng ta có thể sử dụng Method References để thay thế cho các Lambda Expression khi Lamba gọi một phương thức nào đó đã được định nghĩa sẵn.
  • Chúng ta không thể truyền tham số cho các Method References, phải sử dụng đi kèm với Functional Interfaces.
4.7
26
Nếu bạn thấy hay thì hãy chia sẻ bài viết cho mọi người nhé! Và Donate tác giả

Shares

Chuyên mục: Java 8 Được gắn thẻ: Java 8

Functional Interface trong Java 8
Biểu thức Lambda trong Java 8 – Lambda Expressions

Có thể bạn muốn xem:

  • Supplier trong Java 8 (04/06/2018)
  • Thực thi nhiều tác vụ cùng lúc như thế nào trong Java? (01/02/2019)
  • Tìm hiểu cơ chế Lazy Evaluation của Stream trong Java 8 (15/09/2019)
  • Interface trong Java 8 – Default method và Static method (26/04/2018)
  • Loại bỏ các phần tử trùng trong một ArrayList như thế nào trong Java 8? (24/02/2019)

Bình luận

bình luận

Tìm kiếm

Bài viết mới

  • Clean code 13/01/2024
  • Giới thiệu CloudAMQP – Một RabbitMQ server trên Cloud 02/10/2020
  • Kết nối RabbitMQ sử dụng Web STOMP Plugin 19/06/2020
  • Sử dụng publisher confirm trong RabbitMQ 16/06/2020
  • Sử dụng Dead Letter Exchange trong RabbitMQ 13/06/2020

Xem nhiều

  • Hướng dẫn Java Design Pattern – Factory Method (97661 lượt xem)
  • Hướng dẫn Java Design Pattern – Singleton (97347 lượt xem)
  • Giới thiệu Design Patterns (87186 lượt xem)
  • Lập trình đa luồng trong Java (Java Multi-threading) (85899 lượt xem)
  • Giới thiệu về Stream API trong Java 8 (83407 lượt xem)

Nội dung bài viết

  • 1 Method References là gì?
  • 2 Các loại Method References

Lưu trữ

Thẻ đánh dấu

Annotation Authentication Basic Java Behavior Pattern Collection Creational Design Pattern Cấu trúc điều khiển Database Dependency Injection Design pattern Eclipse Exception Executor Service Google Guice Gson Hibernate How to Interceptor IO Jackson Java 8 Java Core JDBC JDK Jersey JMS JPA json JUnit JWT Message Queue Mockito Multithreading OOP PowerMockito RabbitMQ Reflection Report REST SOAP Structuaral Pattern Swagger Thread Pool Unit Test Webservice

Liên kết

  • Clean Code
  • JavaTpoint
  • Refactoring Guru
  • Source Making
  • TutorialsPoint
  • W3Schools Online Web Tutorials

Giới thiệu

GP Coder là trang web cá nhân, được thành lập với mục đích lưu trữ, chia sẽ kiến thức đã học và làm việc của tôi. Các bài viết trên trang này chủ yếu về ngôn ngữ Java và các công nghệ có liên quan đến Java như: Spring, JSF, Web Services, Unit Test, Hibernate, SQL, ...
Hi vọng góp được chút ít công sức cho sự phát triển cộng đồng Coder Việt.

Donate tác giả

Tìm kiếm các bài viết của GP Coder với Google Search

Liên hệ

Các bạn có thể liên hệ với tôi thông qua:
  • Trang liên hệ
  • Linkedin: gpcoder
  • Email: contact@gpcoder.com
  • Skype: ptgiang56it

Follow me

Copyright 2025 © GP Coder · All Rights Reserved · Giới thiệu · Chính sách · Điều khoản · Liên hệ ·

Share

Blogger
Delicious
Digg
Email
Facebook
Facebook messenger
Flipboard
Google
Hacker News
Line
LinkedIn
Mastodon
Mix
Odnoklassniki
PDF
Pinterest
Pocket
Print
Reddit
Renren
Short link
SMS
Skype
Telegram
Tumblr
Twitter
VKontakte
wechat
Weibo
WhatsApp
X
Xing
Yahoo! Mail

Copy short link

Copy link