复合Lambda表达式


import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
import java.util.function.Function;
import java.util.function.Predicate;

/**
 * 复合Lambda表达式
 */
public class Demo {

    public static <T> List<T> filter(List<T> list, Predicate<T> p ){
        List<T> res = new ArrayList<>();
        for (T t : list) {
            if (p.test(t)){
                res.add(t);
            }
        }
        return res;
    }

    public static void main(String[] args){
        List<Apple> appleList = Arrays.asList(new Apple("red",12),new Apple("yellow",15),new Apple("green",10),new Apple("red",10));
        // 比较器复合
        //逆序,按重量递减排序
        appleList.sort(Comparator.comparing(Apple::getWeight).reversed());


        //比较器链
        appleList.sort(Comparator.comparing(Apple::getWeight)
            .reversed()
            .thenComparing(Apple::getColor)
        );

        //谓词复合, negate,and,or      非,与,或
        Predicate<Apple> redApple = apple -> "red".equals( apple.getColor());

        List<Apple> list = filter(appleList, redApple);

        Predicate<Apple> notRedApple = redApple.negate();

        Predicate<Apple> redAndHeavyApple = redApple.and(a -> a.getWeight()>10);

        Predicate<Apple> redAndHeavyAppleOrGreen = redAndHeavyApple.or(a->"green".equals(a.getColor()));

        List<Apple> list2 = filter(appleList, redAndHeavyAppleOrGreen);

        //函数复合 g(f(x))
        Function<Integer,Integer> f = x -> x + 1;
        Function<Integer,Integer> g = x -> x * 2;
        Function<Integer,Integer> h = f.andThen(g);
        int res = h.apply(1);
        System.out.println(res);

        //函数复合 f(g(x))
        Function<Integer,Integer> h2 = f.compose(g);
        res = h2.apply(1);
        System.out.println(res);
    }
}


import java.util.function.Function;

/**
 * 函数复合
 * 模拟写一封信
 */
public class Demo2 {
    //抬头
    public static String addHeader(String text){
        return "From Fly:\n" + text;
    }
    //落款
    public static String addFooter(String text){
        return text + "\n\t\tKind";
    }
    //拼写检查
    public static String checkSpelling(String text){
        return text.replaceAll("labda","lambda");
    }
    public static void main(String[] args){
        Function<String,String> addHeader = Demo2::addHeader;
        Function<String,String> transformationPipeline =
                addHeader.andThen(Demo2::checkSpelling)
                         .andThen(Demo2::addFooter);

        String letter = transformationPipeline.apply("I like labda");
        System.out.println(letter);
    }
}
posted @ 2020-04-06 10:35  fly_bk  阅读(187)  评论(0编辑  收藏  举报