Java 8 新特性之函數式接口

1. 概述

1.1 簡介

在開發中使用 Lambda 表達式時,咱們若是每次都本身定義函數接口也是一件很麻煩的事情,因此java 8 已經提供了一個函數式接口供咱們來使用。最經常使用的接口包括 Function<T, R>Predicate<T>Supplier<T>Consumer<T>,它們是在 java.util.function 包中定義的,日常基本的使用都是能夠知足的,若是再有其它知足不了的需求,再進行自定義接口java

2. 內置函數接口

2.1 Consumer<T> 消費型接口

只有一個參數,且沒有返回值的函數app

/**
 * 表示接受單個輸入參數且不返回結果的操做。
 *
 * @param <T> 輸入到操做的類型
 */
@FunctionalInterface
public interface Consumer<T> {

    void accept(T t);
}

1. 實例

@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);
}

2.2 Supplier<T> 供給型接口

沒有參數,且只有一個返回值的函數dom

/**
 * 表示結果的提供者。
 *
 * 沒有要求每次調用供應商時都返回一個新的或不一樣的結果。
 * 
 * @param <T> supplier 返回結果的類型
 */
@FunctionalInterface
public interface Supplier<T> {

    T get();
}

1. 實例

產生指定個數的隨機整數,並放入到集合中函數

@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;
}

2.3 Function<T, R> 函數型接口

有一個參數和一個返回值的函數code

/**
 * 表示接受一個參數並生成結果返回的函數。
 *
 * @param <T> 函數的輸入類型
 * @param <R> 函數的返回類型
 */
@FunctionalInterface
public interface Function<T, R> {

    R apply(T t);
}

1. 實例

根據規則處理字符串對象

@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);
}

2.4 Predicate<T> 斷言型接口

/**
 * 布爾值函數。
 *
 * @param <T> 被判斷對象的類型
 */
@FunctionalInterface
public interface Predicate<T> {

    boolean test(T t);
}

1. 實例

過濾知足條件的整數並返回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;
}

2.5 其餘接口

函數式接口 參數類型 返回類型 用途
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 新特性之函數式接口
做者: 凌風
相關文章
相關標籤/搜索