java-FP

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版权协议,转载请附上原文出处链接和本声明。