SRC
无论FP还是OOP,都是为了解决问题。都需要化简,也就意味着封装,只不过封装的形式不同。FP是将行为封装,将属性抽象为不可变的输入和输出。???
FP从使用上来说,可以将一段逻辑(也就是函数)作为输入和输出,形成一个类似递归的嵌套式结构。
java将几种常用逻辑抽象为一种特殊接口,用@FunctionalInterface注解来标识。
这种接口只有一个抽象方法,涵盖了3种常用的逻辑,每个函数都是对应接口的实现,这也就意味着可以调用接口中的default方法。比如入1出1的Function,入0出1的Supplier
一、traps
1. java的FP也有执行和转换的概念,比如map函数,不会单独执行,后面要跟能触发执行的函数。foreach是执行函数。
2. java的函数也可以用变量接收
二、usage个论https://www.cnblogs.com/heimianshusheng/p/5672641.html
1. Predicate 预测,断言,入1出布尔
Predicate<String> predicate = (s) -> s.length() > 0;
predicate.test("foo"); // true
predicate.negate().test("foo"); // false
Predicate<Boolean> nonNull = Objects::nonNull;
Predicate<Boolean> isNull = Objects::isNull;
Predicate<String> isEmpty = String::isEmpty;
Predicate<String> isNotEmpty = isEmpty.negate();
2. Function 函数,入1出1
附带了一些可以和其他函数组合的默认方法(compose, andThen)
Function<String, Integer> toInteger = Integer::valueOf;
Function<String, String> backToString = toInteger.andThen(String::valueOf);
backToString.apply("123"); // "123"
3. Supplier 提供者,入0出1
Supplier 接口返回一个任意范型的值,该接口没有任何参数
Supplier<Person> personSupplier = Person::new;
personSupplier.get(); // new Person
4. Consumer消费者,入1出0
Consumer<Person> greeter = (p) -> System.out.println("Hello, " + p.firstName);
greeter.accept(new Person("Luke", "Skywalker"));
5. Comparator 比较,入2出布尔
Comparator<Person> comparator = (p1, p2) -> p1.firstName.compareTo(p2.firstName);
Person p1 = new Person("John", "Doe");
Person p2 = new Person("Alice", "Wonderland");
comparator.compare(p1, p2); // > 0
comparator.reversed().compare(p1, p2); // < 0
版权声明:本文为qq_34224565原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。