Java Supplier可以优化对象实例化过程吗?

时间:2016-11-03 11:59:31

标签: java lambda interface functional-programming

我必须开发一个像这样的简单代码:

public class TestSupplier {


public static void main(String[] args) {
    // TODO Auto-generated method stub

    TestSupplier ts1 = new TestSupplier();

    List<String> lman = ts1.getList(new String[]{"Bob","Tom","Jack","Rob"});
    List<String> lwom = ts1.getList(new String[]{"Barbara","Francesca","Jenny","Sim"});
    List<String> ldog = ts1.getList(new String[]{"Ciuffy","Red","Fido"});


}

public List<String> getList (String[] n) {

    List<String> list1 = new ArrayList<String>();

    for (int i = 0; i < n.length ; i++) {
        list1.add(n[i]);
    }

    return list1;
}

}

每次程序调用&#34; getList&#34;方法在内存中创建一个新的list1对象。 我试图找到一种优化此行为的最佳方法,并且我已经以这种方式修改了代码:

public class TestSupplier {

Supplier<List<String>> lsup = ArrayList<String>::new;

public static void main(String[] args) {
    // TODO Auto-generated method stub

    TestSupplier ts1 = new TestSupplier();

    List<String> lman = ts1.getList(new String[]{"Bob","Tom","Jack","Rob"});
    List<String> lwom = ts1.getList(new String[]{"Barbara","Francesca","Jenny","Sim"});
    List<String> ldog = ts1.getList(new String[]{"Ciuffy","Red","Fido"});


}

public List<String> getList (String[] n) {

    List<String> list1 = lsup.get();

    for (int i = 0; i < n.length ; i++) {
        list1.add(n[i]);
    }

    return list1;
}

}

我已经在&#34; getList&#34;中创建了一个供应商作为实例变量。方法我只是调用他的get方法来创建对象。

这可能是优化代码的最佳方法吗?

提前致谢

1 个答案:

答案 0 :(得分:1)

根本不优化代码。你每次都在创建一个新的ArrayList,除了不是直接调用构造函数,你调用一个调用构造函数的供应商。所以它实际上稍微慢一些,而且不那么简单。

我会使用new ArrayList<>(Arrays.asList(n))。这至少具有初始化ArrayList的优势,初始大小足以包含数组中的所有元素,因此将避免大型数组的大小调整操作。如果原始数组支持的固定大小列表可以接受,则只需Arrays.asList(n)