
Functional Interfaces
2021, Sep 30
Functional Interfaces
Functional Interface là các Interface có duy nhất một method trừu trượng, được đánh dấu bởi annotation @FunctionalInterface
Sử dụng Functional Interface thông qua Lambda Expressions
- Dạng 1
(args) -> {block code}
- Dạng 2: dành cho block code chỉ có 1 dòng lệnh
(args) -> code
Tiếp theo là một số Functional Interfaces có sẵn trong Java 8 thường được sử dụng
Supplier
- Suplier chứa method trừu tượng không tham số, và return về một đối tượng
@FunctionalInterface
public interface Supplier<T> {
T get();
}
- Ví dụ: sử dụng functional interface Supplier
public void println(Supplier<String> supp) {
System.out.println(supp.get());
}
public void beforeJava8() {
println(new Supplier<String>(){
@Override
public String get() {
return "Example";
}
});
}
public void java8() {
println(() -> "Example");
}
Consumer
- Consumer chứa method trừu tượng có một tham số đầu vào và không return (void method).
@FunctionalInterface
public interface Consumer<T> {
void accept(T t);
}
- Ví dụ: print một List trong java
List<String> list = Arrays.asList("a", "b", "c", "d", "e");
public void beforeJava8() {
list.forEach(new Consumer<String>() {
@Override
public void accept(String s) {
System.out.print(s + "\t");
}
});
System.out.println();
}
public void java8() {
list.forEach(s -> System.out.print(s + "\t"));
System.out.println();
}
Predicate
- Predicate chứa method trừu tượng có một tham số đầu vào, và return boolean (true/false)
@FunctionalInterface
public interface Predicate<T> {
boolean test(T t);
}
- Ví du: lọc các số lẻ trong một list Integer
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6);
public void beforeJava8() {
Stream<Integer> stream2 = list.stream().filter(new Predicate<Integer>() {
@Override
public boolean test(Integer t) {
return t % 2 == 1;
}
});
}
public void java8() {
Stream<Integer> stream2 = list.stream().filter(t -> {
return t % 2 == 1;
});
}
Function
- Function chứa method trừu tượng có một tham số đầu vào và return một tham số khác
@FunctionalInterface
public interface Function<T, R> {
R apply(T t);
}
- Ví dụ: upper case danh sách các String
List<String> list = Arrays.asList("a", "c", "B", "D", "e");
public void beforeJava8() {
Stream<String> stream2 = list.stream().map(new Function<String, String>() {
@Override
public String apply(String s) {
return s == null ? null : s.toUpperCase();
}
});
}
public void java8() {
Stream<String> stream2 = list.stream().map(s -> s == null ? null : s.toUpperCase());
}
Comparator
- Trước Java 8, Comparator là một Interface được sử dụng nhiều để so sánh 2 tham số.
Từ Java 8, Functional interface Comparator chứa method trừu tượng có 2 tham số (a, b) và return kiểu int với ý nghĩa
- 1: a>b
- 0: a=b
- -1: a < b
@FunctionalInterface
public interface Comparator<T> {
int compare(T o1, T o2);
}
- Ví dụ: sắp xếp danh sách số nguyên
List<Integer> list = Arrays.asList(1, 5, 2, 6, 3, 4, 7);
public void beforeJava8() {
Collections.sort(list, new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o1.compareTo(o2);
}
});
}
public void java8() {
Collections.sort(list, (o1, o2) -> o1.compareTo(o2));
}
Source code ở đây