(三) Java函数式编程:函数式接口

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();
    }
}

函数式风格的代码,给人感觉很新鲜,一种很不同的感觉。

思考

  • 如果项目里面,有很多函数式的接口,那么会给项目维护提高难度吗?
    函数式风格的代码,跟命令式的风格的代码,确实很不一样。对初级工程师,可能函数式有些难理解,不过对于工作五年以上的人,问题应该不大。

发表评论

邮箱地址不会被公开。 必填项已用*标注