函數式接口的使用

import java.util.ArrayList;
import java.util.List;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Predicate;

public class FunctionTest {

    /**
     * Predicate
     * java.util.function.Predicate<T>接口定義了一個名叫test的抽象方法,它接受泛型 T對象,並返回一個boolean。
     * 如果你去查Predicate接口的Javadoc說明,可能會注意到諸如and和or等其他方法。現在 你不用太計較這些,我們會在3.8節討論
     * @param list
     * @param predicate
     * @param <T>
     * @return
     */
    public static <T> List<T> filter(List<T> list, Predicate<T> predicate){
        List<T> results = new ArrayList<>();
        for (T t : list) {
            if (predicate.test(t)){
                results.add(t);
            }
        }
        return results;
    }

    /**
     * Consumer
     * java.util.function.Consumer<T>定義了一個名叫accept的抽象方法,它接受泛型T 的對象,沒有返回(void)。
     * 你如果需要訪問類型T的對象,並對其執行某些操作,就可以使用 這個接口。
     * List的forEach的的底層其實用到了 Consumer 這個函數式接口
     * @param list
     * @param consumer
     * @param <T>
     */
    public static <T> void forEachPrint(List<T> list, Consumer<T> consumer){
        for (T t : list) {
            consumer.accept(t);
        }
    }

    /**
     * java.util.function.Function<T, R>接口定義了一個叫作apply的方法,它接受一個 泛型T的對象,並返回一個泛型R的對象。
     * 如果你需要定義一個Lambda,將輸入對象的信息映射 到輸出,就可以使用這個接口。
     * @param list
     * @param function
     * @param <T>
     * @param <R>
     * @return
     */
    public static <T,R> List<R> map(List<T> list, Function<T,R> function){
        List<R> results = new ArrayList<>();
        for (T t : list) {
            R apply = function.apply(t);
            results.add(apply);
        }
        return results;
    }



    public static void main(String[] args) {
        /**
         *  Predicate的使用
         */
        List<String> list = new ArrayList<>();
        List<String> filter = FunctionTest.filter(list, (s -> !s.trim().isEmpty()));

        /**
         * Consumer的使用,打印還可以直接使用第二種方式
         */
        FunctionTest.forEachPrint(list,s -> {
            System.out.println(s);
        });
        FunctionTest.forEachPrint(list,System.out::println);

        /**
         * Function的使用
         * 輸入字符串,得到字符串的長度
         */
        List<Integer> map = FunctionTest.map(list, s -> s.length());
        
    }

}

來源:《java8實戰》

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章