Java发展到Java8之后推出了函数式编程,但是和C# 比起来晚了很多年,看上去和实际的操作,C#的函数式编程实现的更好一些,C#的lamda表达式实现起来很舒服自然。当然绝大部分归功于delegate的实现。
但是Java也向前迈进了一步,虽然lamda看起来怪怪的,是通过函数式接口实现的,归根到底Java和C#的函数式实现都是类的实现,只是C#的糖更甜一些;
在Java中系统预留了一些函数式接口;和C#中的Action和Fun类似;具体如下:
1、Predicates
predicate 是一个布尔类型的函数,该函数只有一个输入参数,predicate的接口包含了多种默认用于处理复杂的逻辑动词(and or negate)
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、 Functions
function 接口接收一个参数,并返回单一的结果。默认方法可以将多个函数串在一起(compse andThen)
Function<String, Integer> toInteger = Integer::valueOf;
Function<String, String> backToString = toInteger.andThen(String::valueOf);
backToString.apply("123"); // "123
3、Suppliers
Suppliers 接口产生一个给定类型的结果,与Function不同的是,supplier没有输入参数
-
Supplier<Person> personSupplier = Person::new;
-
personSupplier.get(); // new Person
4、Consumers
Consumer 代表了在一个输入参数上需要进行的操作
-
Consumer<Person> greeter = (p) -> System.out.println("Hello, " + p.firstName);
-
greeter.accept(new Person("Luke", "Skywalker"));
5、Comparators
comparator 接口在早期的Java版本中非常著名,Java8为这个接口添加了不同的默认方法;
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
6、Optionals
optional 不是一个函数式接口,二十一个精巧的工具接口,用来防止
NullPointerEception产生。