首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >什么时候使用功能接口?(Java 8)

什么时候使用功能接口?(Java 8)
EN

Stack Overflow用户
提问于 2014-01-02 23:45:32
回答 1查看 2.9K关注 0票数 0

最近,我转向为Java 8开发我的软件,我一直在慢慢地改进我对Java 8的使用,并对Java 8感到满意,在这样做的过程中,我开始实现越来越多的功能接口,最近NetBeans开始建议我将一些for循环转换为功能接口,但从程序运行的方式来看,它似乎比使用for循环(分别为1.9秒和.9秒)要慢得多。所以我的问题是--用函数接口代替for循环值得吗?一般来说,什么时候应该使用功能接口?功能接口在其他方面是否更有效率?提前谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-01-03 01:10:45

如果您的lambda不使用许多捕获变量,那么我相信性能将更接近于循环标准。使用lambda的优点是更容易并行化(尽管对于有序流,这可能会导致性能更慢)和更容易读取语法。另外,需要注意的是,hotspot编译器将随着时间的推移而更改结果(您的第一个循环执行很可能比最后一个要慢)。

我不知道具体情况,但在最坏的情况下,您可以将lambda实现为匿名类。在最好的情况下,它只是一个MethodHandle。

快速测试:

代码语言:javascript
复制
public class Test {

    public static void main(String... args) {
        Random r = new Random(42);
        for(int i = 0; i < 10; i++) {
            testFor();
            testLambda();
        }
    }

    protected static final int TestLength = 1024 * 1024 * 16;

    protected static int result;

    protected static void testFor() {
        Random r = new Random(42);
        long start = System.currentTimeMillis();
        for(int i = 0; i < TestLength; i++) {
            result = r.nextInt(TestLength);
        }
        long end = System.currentTimeMillis();
        System.out.printf("testFor = %dms%n", end - start);
    }

    protected static void testLambda() {
        Random r = new Random(42);
        IntStream stream = IntStream.iterate(0, i -> r.nextInt(1024 * 1024));
        long start = System.currentTimeMillis();
        stream.limit(TestLength).forEach(i -> {result = i;});
        long end = System.currentTimeMillis();
        System.out.printf("testLambda = %dms%n", end - start);
    }

}

结果:

代码语言:javascript
复制
testFor = 209ms
testLambda = 207ms
testFor = 210ms
testLambda = 206ms

对于并行流,结果实际上要慢一些(在我的机器上大约是2倍),因为流是有序的,每个线程都有大量的同步开销,与正在完成的工作相比(只需要result = i)。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20894069

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档