Java 8 giới thiệu một package mới chứa các Functional Interface tên là java.util.function. Trong package này, chúng ta có nhiều interface như Consumer, Supplier, Predicate,… Trong bài viết này chúng ta sẽ tìm hiểu về Functional Interface Consumer các bạn nhé!
Nội dung của Interface này như sau:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
package java.util.function; import java.util.Objects; /** * Represents an operation that accepts a single input argument and returns no * result. Unlike most other functional interfaces, {@code Consumer} is expected * to operate via side-effects. * * <p>This is a <a href="package-summary.html">functional interface</a> * whose functional method is {@link #accept(Object)}. * * @param <T> the type of the input to the operation * * @since 1.8 */ @FunctionalInterface public interface Consumer<T> { /** * Performs this operation on the given argument. * * @param t the input argument */ void accept(T t); /** * Returns a composed {@code Consumer} that performs, in sequence, this * operation followed by the {@code after} operation. If performing either * operation throws an exception, it is relayed to the caller of the * composed operation. If performing this operation throws an exception, * the {@code after} operation will not be performed. * * @param after the operation to perform after this operation * @return a composed {@code Consumer} that performs in sequence this * operation followed by the {@code after} operation * @throws NullPointerException if {@code after} is null */ default Consumer<T> andThen(Consumer<? super T> after) { Objects.requireNonNull(after); return (T t) -> { accept(t); after.accept(t); }; } } |
Vì Consumer là một Functional Interface nên nó chỉ định nghĩa một phương thức abstract là accept(). Ngoài ra, như các bạn thấy, nó còn định nghĩa thêm một phương thức default andThen().
Phương thức accept() được định nghĩa với một tham số generic và không trả về gì cả. Và chúng ta sẽ sử dụng tham số này để thao tác, tính toán này nọ.
Ví dụ như chúng ta thường sử dụng interface Consumer trong phương thức forEach() của các đối tượng Collection như List, Set, …
1 2 3 4 5 6 7 8 9 10 11 12 |
package com.huongdanjava.javaexample; import java.util.Arrays; import java.util.List; public class Example { public static void main(String[] args) { List<String> s = Arrays.asList("Khanh", "Quan"); s.stream().forEach(System.out::println); } } |
Phương thức forEach() sẽ truyền giá trị của từng phần tử trong list s vào tham số của phương thức accept() của interface Consumer và ở đây mình đang sử dụng System.out.println() để in giá trị của phần tử này ra console.
Kết quả:
Phương thức andThen() mang ý nghĩa chúng ta có nhiều thao tác cần thực hiện, và sử dụng phương thức này giúp chúng ta thực hiện được nhiều thao tác cùng một lúc.
Ví dụ như:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
package com.huongdanjava.javaexample; import java.util.function.Consumer; public class Example { public static void main(String[] args) { Consumer<String> c1 = s -> System.out.println(s + " Khanh"); Consumer<String> c2 = s -> System.out.println(s + " Huong Dan Java"); c1.andThen(c2).accept("Hello"); } } |
Trong ví dụ trên, chúng ta sẽ thực hiện thao tác 1 tới thao tác 2 với giá trị được truyền vào là “Hello”.
Kết quả:
Trong package java.util.function, chúng ta còn có một số biến thể của Functional Interface Consumer như:
- IntConsumer: với tham số trong phương thức accept() kiểu Integer.
- DoubleConsumer: với tham số trong phương thức accept() kiểu Double.
- LongComsumer: với tham số trong phương thức accept() kiểu Long.
BiConsumer: phương thức accept() của interface này chứa 2 tham số với kiểu giá trị khác nhau nhưng chức năng vẫn tương tự như interface Consumer các bạn nhé! Ví dụ:
1 2 3 4 5 6 7 8 9 10 11 12 |
package com.huongdanjava.javaexample; import java.util.function.BiConsumer; public class Example { public static void main(String[] args) { BiConsumer<String, String> bc = (a, b) -> System.out.println("Hello: " + a + ", hello: " + b); bc.accept("Khanh", "Huong Dan Java"); } } |
Kết quả:
Hùng
Ví dụ như chúng ta thường sử dụng interface Consumer trong phương thức forEach() của các đối tượng Collection như List, Set, …
Mã là
public static void main(String[] args) throws IOException {
List s = Arrays.asList(“Khanh”, “Quan”);
s.stream().forEach(System.out::println);
}
=>Consumer mà anh nói mã này nằm ở đâu,anh có thể giải thích kỹ hơn chỗ này hộ em được khôn anh?
Khanh Nguyen
Trong phương thức forEach() thì interface Consumer là tham số của phương thức này đó em.