函数式接口的使用

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实战》

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