Java内置的函数式接口
JDK 8 中提供了一组常用的核心函数接口:
| 接口 | 参数 | 返回类型 | 描述 |
|---|---|---|---|
| Predicate |
T | boolean | 用于判别一个对象。 |
| Consumer |
T | void | 用于接收一个对象进行处理但没有返回 |
| Function<T, R> | T | R | 转换一个对象为不同类型的对象 |
| Supplier |
None | T | 提供一个对象 |
| UnaryOperator |
T | T | 接收对象并返回同类型的对象 |
| BinaryOperator |
(T, T) | T | 接收两个同类型的对象,并返回一个原类型对象 |
其中 Cosumer 与 Supplier 对应,一个是消费者,一个是提供者。
Predicate 用于判断对象是否符合某个条件,经常被用来过滤对象。
Function 是将一个对象转换为另一个对象,比如说要装箱或者拆箱某个对象。
UnaryOperator 接收和返回同类型对象,一般用于对对象修改属性。BinaryOperator 则可以理解为合并对象。
例子
private interface RedisStore {
default void execute(Consumer<Jedis> func) {
Jedis jedis = new Jedis();
try {
func.accept(jedis);
} catch (Exception e) {
}
}
}
private static class Jedis {
public void get(String key) {
}
public void delete(String key) {
}
public void set(String key, String value) {
}
}
public class LambdaTest {
public static void main(String[] args) {
run();
}
public static void run() {
RedisStore redisStore = new RedisStore() {
};
redisStore.execute(jedis -> {
String key = keyFor("key1");
jedis.get(key);
});
redisStore.execute(jedis -> {
String key = keyFor("key2");
jedis.delete(key);
});
redisStore.execute(jedis -> {
String key = keyFor("key3");
String value = "some value";
jedis.set(key, value);
});
}
private static String keyFor(Object... args) {
StringJoiner stringJoiner = new StringJoiner(":");
for (Object arg : args) {
stringJoiner.add(String.valueOf(arg));
}
return stringJoiner.toString();
}
}
函数式风格的代码,给人感觉很新鲜,一种很不同的感觉。
思考
- 如果项目里面,有很多函数式的接口,那么会给项目维护提高难度吗?
函数式风格的代码,跟命令式的风格的代码,确实很不一样。对初级工程师,可能函数式有些难理解,不过对于工作五年以上的人,问题应该不大。