1.38 如何重构此循环? | Java Debug 笔记

137 阅读2分钟

本文正在参加「Java主题月 - Java Debug笔记活动」,详情查看 活动链接

Debug 笔记 <如何重构此循环?>

提问

我有一个应用程序,在该应用程序中,我将原始数组和列表用于名为Item的类。由于遗留原因,它们可以互换使用(我也希望这只是一种类型,但事实就是这样)。 现在,我必须添加一个通过for-each循环运行的新方法,如下所示:

public void something(Item... items) {
    for (Item i : items) {
        doStuff();
    }
}

public void something(List<Item> items) {
    for (Item i : items) {
        doStuff();
    }
}

换句话说,对原始数组和列表使用完全相同的方法两次。有什么方法可以很好地将其重构为单个方法吗?

回答一

在这两个选项中,最好让数组重载调用列表重载:

public void something(Item... items) {
  something(Arrays.asList(item));
}

这很便宜,因为它不复制数组,而是包装它:创建Listis O(1)。

如果要从列表重载中调用数组重载:

public void something(List<Item> items) {
  something(items.toArray(new Item[0]));
}

这将更加昂贵,因为toArray调用必须创建并填充数组:这是一个O(n)操作,其中n列表的大小在哪里。但是,它具有something无法替换的内容的微小优点List,因为对数组的任何更新在执行后都会被丢弃。

回答二

如果您使用Java 8,也可以只调用forEachmapJavaStream完成操作,例如

yourStream.forEach(doStuff());

回答三

您可以实现一个方法,在这种情况下,可以实现第二个方法,因为它有一个列表作为参数。

除了第一个方法,您可以使用转换列表中的数组Arrays.asList(items),然后可以调用第一个方法。

因此,最后,您将只有一个方法(以列表作为参数)。

另外,如果项目列表中的元素很少,则可以使用Java 8中的lambda表达式:

items.foreach(item -> doStuff(item));

因此,您将不会拥有仅包含一个循环的方法,并且代码将更易于阅读。

文章翻译自Stack Overflow :stackoverflow.com/questions/4…