复合Lambda表达式

Posted fly-book

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了复合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:
" + text;
    }
    //落款
    public static String addFooter(String text){
        return text + "
		Kind";
    }
    //拼写检查
    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);
    }
}

以上是关于复合Lambda表达式的主要内容,如果未能解决你的问题,请参考以下文章

Linq to SQL 使用 Lambda 语法进行左外连接并在 2 列上连接(复合连接键)

IntelliJ:求值lambda表达式在调试时引发编译错误

使用 savedInstanceState 保存和恢复 Kotlin lambda

Java8—Lambda表达式方法引用默认方法的详细介绍一万字

JavaSE-Java8-函数复合用法

JAVA由一个将JSONArray转成Map的需求引发的lambda语法的学习