Java8特性系列Lambdas二 functional interface

Java8特性之Lambdas(二)functional interface

  • lambda表达式,语法
    (参数) -> 表达式
    或者
    (参数) -> {语句;}
  1. () -> {}
  2. (int i) -> i>10
  3. () -> “hello”
  4. (int i) -> return 0;
    上面的表达式中,4是不对的,应该为(int i) -> {return 0;}
  • lambda表达式,使用
    前提需要有一个函数接口(functional interface),例如上一节讲到的FilterIntf,就是functional interface,因为它只有一个接口方法:
public interface FilterIntf {
    boolean filter(Student student);
}
//这种定义就不是functional interface,因为没有要实现的方法
public interface FilterIntf {
}

在JDK中也有很多funcional interface,比如常用的:Runnable、Comparator、Callable,他们都有且只有一个接口方法,例如我们要创建一个线程可以这样:

    @Test
    public void testThreadByLambda(){
        new Thread(() -> System.out.println("hello thread")).start();
    }

也可以

    Runnable r = () -> System.out.println("hello thread2");
    new Thread(r).start();
  • 实际中的例子,得到程序的执行时间
    @Test
    public void testExecTime() throws InterruptedException {
        long st = System.currentTimeMillis();
        for(int i=0; i<10; ++i){
            i += 1;
            Thread.sleep(500);
        }
        System.out.println(System.currentTimeMillis() - st);
    }

缺点:不够灵活,每个方法中都需要得到startTime和endTime,不好维护
使用Lambda来封装这个例子:

  1. 使用Suplier,它是java.util.function提供的Functional Interface,是一个() -> T
    public static <T> T traceTime(Supplier<T> methord){
        long start = System.currentTimeMillis();
        try{
            T result = methord.get();
            return result;
        }finally{
            System.out.println(System.currentTimeMillis() - start);
        }
    }

这样我们就可以传入一个方法,然后就可以得到方法的执行时间,但是还可以再完善,试想一下如果不适用println,使用Log4j呢?那么很明显时间内容处理也需要抽象出来。

  1. 增加一个TimeTracer接口,可以任意的实现时间内容的处理方式
    public interface TimeTracer {
        void onTrace(long cast);
    }

  1. 最后得到
    //Utils.java中的方法
    public static <T> T traceTime(Supplier<T> methord, TimeTracer tracer){
        long start = System.currentTimeMillis();
        try{
            T result = methord.get();
            return result;
        }finally{
            tracer.onTrace(System.currentTimeMillis() - start);
        }
    }
  1. testExecTime就可以修改为:
    @Test
    public void testExecTime(){
        Utils.traceTime(() -> {
            for (int i=0; i<10; ++i){
                i = i + 1;
                try {
                    Thread.sleep(500);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            return 0;
        }, (cast -> System.out.println("exec time: " + cast/1000.00 + "s")));
    }

示例代码下载

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值