在開發中使用 Lambda 表達式時,咱們若是每次都本身定義函數接口也是一件很麻煩的事情,因此java 8 已經提供了一個函數式接口供咱們來使用。最經常使用的接口包括 Function<T, R>
、Predicate<T>
、Supplier<T>
和 Consumer<T>
,它們是在 java.util.function
包中定義的,日常基本的使用都是能夠知足的,若是再有其它知足不了的需求,再進行自定義接口java
Consumer<T>
消費型接口只有一個參數,且沒有返回值的函數app
/** * 表示接受單個輸入參數且不返回結果的操做。 * * @param <T> 輸入到操做的類型 */ @FunctionalInterface public interface Consumer<T> { void accept(T t); }
@Test public void t1(){ handle(100,(x) -> System.out.println("handle result : " + x * x)); } public void handle(Integer m,Consumer<Integer> consumer) { consumer.accept(m); }
Supplier<T>
供給型接口沒有參數,且只有一個返回值的函數dom
/** * 表示結果的提供者。 * * 沒有要求每次調用供應商時都返回一個新的或不一樣的結果。 * * @param <T> supplier 返回結果的類型 */ @FunctionalInterface public interface Supplier<T> { T get(); }
產生指定個數的隨機整數,並放入到集合中函數
@Test public void t2(){ List<Integer> list = getRandomNumList(10,() -> (int)(Math.random() * 100)); System.out.println(list.toString()); } public List<Integer> getRandomNumList(Integer limit, Supplier<Integer> supplier) { List<Integer> list = new ArrayList<>(); for (int i = 0 ; i < limit ; i++){ list.add(supplier.get()); } return list; }
Function<T, R>
函數型接口有一個參數和一個返回值的函數code
/** * 表示接受一個參數並生成結果返回的函數。 * * @param <T> 函數的輸入類型 * @param <R> 函數的返回類型 */ @FunctionalInterface public interface Function<T, R> { R apply(T t); }
根據規則處理字符串對象
@Test public void t3() { // 去除空格 String str = strHandler(" abcdef ",(x) -> x.trim()); System.out.println("*" + str + "*"); } /** * 根據規則處理字符串 * * @param str 待處理字符串 * @param func Function 函數 * @return 處理結果 */ public String strHandler(String str, Function<String,String> func) { return func.apply(str); }
Predicate<T>
斷言型接口/** * 布爾值函數。 * * @param <T> 被判斷對象的類型 */ @FunctionalInterface public interface Predicate<T> { boolean test(T t); }
過濾知足條件的整數並返回blog
@Test public void t4() { List<Integer> initList = Arrays.asList(3,2,45,32,1,30,10,49,48,6,7,0,8); List<Integer> list = filterNum(initList,(x) -> x > 10); System.out.println("list : " + list.toString()); } /** * 過濾知足條件的整數並返回 * * @param list * @param predicate * @return */ public List<Integer> filterNum(List<Integer> list, Predicate<Integer> predicate) { List<Integer> resList = new ArrayList<>(); for (int i : list) { if (predicate.test(i)) { resList.add(i); } } return resList; }
函數式接口 | 參數類型 | 返回類型 | 用途 |
---|---|---|---|
BiFunction<T, U, R> |
T, U |
R | 對類型爲 T, U 參數應用操做,返回 R 類型的結果,包含方法爲 R apply(T t,U u) |
UnaryOperator<T> (Function 子接口) |
T |
T |
對類型爲 T 的對象進行一元運算,並返回 T 類型的結果,包含方法爲 T apply(T t) |
BinaryOperator<T> (BiFunction 子接口) |
T, T |
T |
對類型爲 T 的對象進行二元運算,並返回 T 類型的結果,包含方法爲 T apply(T t1, T t2) |
BiConsumer<T, U> |
T, U |
void |
對類型爲 T, U 應用操做,包含方法爲 void accept(T t, U u) |
ToIntFunction<T> |
T |
int |
計算 int 值得函數 |
ToLongBiFunction<T, U> |
T |
long |
計算 long 值得函數 |
ToDoubleFunction<T> |
T |
double |
計算 double 值得函數 |
IntFunction<R> |
int |
R |
參數爲 int 類型的函數 |
LongFunction<R> |
long |
R |
參數爲 long 類型的函數 |
DoubleFunction<R> |
double |
R |
參數爲 double 類型的函數 |
本文首發於凌風博客: Java 8 新特性之函數式接口
做者: 凌風