资讯专栏INFORMATION COLUMN

使用Java8的函数式接口简化代码

codeGoogle / 549人阅读

摘要:前言由于这段时间使用的原因,很多东西都用了内部的来做,也没关心底层怎么操作的。首先,我们看下这个内置的函数式接口中的方法,解释为将给定的参数应用于该函数。开始愉快的编码吧。本文代码装了逼赶紧逃。

前言

由于这段时间使用SpringBoot的原因,很多东西都用了SpringBoot内部的Template来做,也没关心底层怎么操作的。最近忙里偷闲回答了几个问题,正巧看到一个关于Redis资源释放问题的,引起了我的兴趣,便去看了下官方文档。
Redis推荐的Java客户端是jedis,关于Jedis的配置那些我就不说了,直接上他的示例代码

You use it by:

/// Jedis implements Closeable. Hence, the jedis instance will be auto-closed after the last statement.
try (Jedis jedis = pool.getResource()) {
  /// ... do stuff here ... for example
  jedis.set("foo", "bar");
  String foobar = jedis.get("foo");
  jedis.zadd("sose", 0, "car"); jedis.zadd("sose", 0, "bike"); 
  Set sose = jedis.zrange("sose", 0, -1);
}
/// ... when closing your application:
pool.destroy();

If you can"t use try-with-resource, you can still enjoy with Jedis.close().

Jedis jedis = null;
try {
  jedis = pool.getResource();
  /// ... do stuff here ... for example
  jedis.set("foo", "bar");
  String foobar = jedis.get("foo");
  jedis.zadd("sose", 0, "car"); jedis.zadd("sose", 0, "bike"); 
  Set sose = jedis.zrange("sose", 0, -1);
} finally {
  // You have to close jedis object. If you don"t close then
  // it doesn"t release back to pool and you can"t get a new
  // resource from pool.
  if (jedis != null) {
    jedis.close();
  }
}
/// ... when closing your application:
pool.destroy();

If Jedis was borrowed from pool, it will be returned to pool with
proper method since it already determines there was
JedisConnectionException occurred. If Jedis wasn"t borrowed from pool,
it will be disconnected and closed.

也就是说要么用Java7的try-with-resource关闭资源,要么就try finally。
唉,又该有人吐槽Java又臭又长了,像老太婆的裹脚布一样。
怎么办呢?
我们可以写一个方法把所有的redis操作包装起来,里面加上资源释放。
呃?工程量好像有点大,而且没逼格。。。
想啊想啊想,能不能在执行Jedis方法的时候加上我们的代码呢?比如在之前获取连接池中的实例,在之后释放资源。
咦,好像aop可以实现啊。
但是我就想用Java8的Lambda装装逼。

首先,我们看下这个Java内置的函数式接口中的apply方法,解释为“将给定的参数应用于该函数”。

可以,正是我们需要的。
开始愉快的编码吧。

第一步:

创建一个Maven工程,指定编译版本和运行版本为jdk1.8,加入jedis依赖。

第二步:

编写Jedis配置类。

import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;

public class RedisConf {

    private static JedisPool pool;

    private RedisConf(){}

    static {
        pool = new JedisPool(new JedisPoolConfig(), "192.168.100.15",6379,60000,"密码手动打码",13);
    }

    public static JedisPool getJedisPool() {
        return pool;
    }
}
第三步:

编写执行器

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import java.util.function.Function;

public class RedisActuator {

    private JedisPool jedisPool = RedisConf.getJedisPool();

    public   R execute(Function fun) {
        try (Jedis jedis = jedisPool.getResource()){
            return fun.apply(jedis);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
}
第四步:

编写测试代码(Jedis官方文档中的示例代码)

import com.fanxian.redis.RedisActuator;
import java.util.Set;

public class App {
    public static void main( String[] args ) {

        RedisActuator redisActuator = new RedisActuator();

        redisActuator.execute(jedis -> jedis.set("foo", "bar"));

        String foobar = redisActuator.execute(jedis -> jedis.get("foo"));

        System.out.println(foobar);

        redisActuator.execute(jedis -> jedis.zadd("sose", 0, "car"));

        redisActuator.execute(jedis -> jedis.zadd("sose", 0, "bike"));

        Set sose = redisActuator.execute(jedis -> jedis.zrange("sose", 0, -1));

        System.out.println(sose);
    }
}

好像代码也没简化多少。

本文代码
:( 装了逼赶紧逃。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/67977.html

相关文章

  • Java8实战》-第三章读书笔记(Lambda表达-01)

    摘要:之前,使用匿名类给苹果排序的代码是的,这段代码看上去并不是那么的清晰明了,使用表达式改进后或者是不得不承认,代码看起来跟清晰了。这是由泛型接口内部实现方式造成的。 # Lambda表达式在《Java8实战》中第三章主要讲的是Lambda表达式,在上一章节的笔记中我们利用了行为参数化来因对不断变化的需求,最后我们也使用到了Lambda,通过表达式为我们简化了很多代码从而极大地提高了我们的...

    longshengwang 评论0 收藏0
  • Java8 之 lambda 表达、方法引用、函数接口、默认方、静态方法

    摘要:欧阳思海继承接口后,又加了新的抽象方法,这个接口就不再是函数式接口默认方法在接口中添加了一个默认方法。总结在这篇文章中,我们讲了表达式方法引用函数式接口接口中的静态方法接口中的默认方法的使用。 今天我来聊聊 Java8 的一些新的特性,确实 Java8 的新特性的出现,给开发者带来了非常大的便利,可能刚刚开始的时候会有点不习惯的这种写法,但是,当你真正的熟悉了之后,你一定会爱上这些新的...

    isLishude 评论0 收藏0
  • 乐字节-Java8新特性之方法引用

    摘要:上一篇小乐介绍了新特性函数式接口,大家可以点击回顾。中引入方法引用新特性用于简化应用对象方法的调用,方法引用是用来直接访问类或者实例的已经存在的方法或者构造方法。方法引用是一种更简洁易懂的表达式。 上一篇小乐介绍了《Java8新特性-函数式接口》,大家可以点击回顾。这篇文章将接着介绍Java8新特性之方法引用。 Java8 中引入方法引用新特性,用于简化应用对象方法的调用, 方法引用是...

    Codeing_ls 评论0 收藏0
  • Java8实战》-第三章读书笔记(Lambda表达-02)

    摘要:上下文比如,接受它传递的方法的参数,或者接受它的值得局部变量中表达式需要类型称为目标类型。但局部变量必须显示的声明,或实际上就算。换句话说,表达式只能捕获指派给它们的局部变量一次。注捕获实例变量可以被看作捕获最终局部变量。 由于第三章的内容比较多,而且为了让大家更好的了解Lambda表达式的使用,也写了一些相关的实例,可以在Github或者码云上拉取读书笔记的代码进行参考。 类型检查、...

    iflove 评论0 收藏0
  • Java8 实战总结

    摘要:一个抽象类可以通过实例变量字段保存一个通用状态,而接口是不能有实例变量的。分组和分区分组多级分组分区是分组的特殊情况由一个谓词返回一个布尔值的函数作为分类函数,它称分区函数。 一、基本概念 两个新特性: 1、函数式编程简化代码复杂度(引入了Lambda表达式) 2、更高效的利用多核CPU 1、基本概念: 1、Lambda基本语法 (parameters) -> expression 对...

    lookSomeone 评论0 收藏0

发表评论

0条评论

codeGoogle

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<