我有两个包含不同类型对象的列表。列表可以:
只有当列表中只有一个元素而不是两个元素时,我才需要做一些操作。示例代码将是这样的:
public void function1(List<int> list1, List<String> list2)
{
if(list1 != null && list2 != null && list1.length + list2.length == 1)
{
if(list1.length > 0)
{
doSomethingWithIntList(list1)
}
else
{
doSomethingWithStringList(list2)
}
}
else if(list1 != null && list1.length == 1)
{
doSomethingWithIntList(list1)
}
else if (list2 != null && list2.length == 1)
{
doSomethingWithStringList(list2)
}
}
使用Java 8功能是否有一些更好,更优雅的方法?我可以通过某种方式避免这些if-else
。或者是否有可用于上述的Apache库?谢谢!
答案 0 :(得分:1)
删除if语句可以简化代码。为了更好的可读性和避免代码重复,引入了一个辅助方法:
public void function1(List<Integer> list1, List<String> list2) {
if (isSingletonCollection(list1)) {
doSomethingWithIntList(list1);
} else if (isSingletonCollection(list2)) {
doSomethingWithStringList(list2);
}
}
private boolean isSingletonCollection(Collection<?> list) {
return list != null && list.size() == 1;
}
由于您使用的是不同类型的列表,除了使用if-else语句之外,没有通用和类型安全的方法来解决您的问题。
答案 1 :(得分:0)
一般来说,我建议不要编写一堆冗长且难以解析的if-else
语句,而是将逻辑分解为更小的方法。 (Flown也注意到了。)
此外,所有空检查都难以阅读。我也倾向于做早期任务以摆脱空值。
为了测试,我还使用了function1的返回值,但是可能会创建其他可能的测试方法。
public EHandled function1(List<Integer> inList1, List<String> inList2)
{
// remove the need for null checks
List<Integer> list1 = (inList1 != null ? inList1 : Collections.emptyList());
List<String> list2 = (inList2 != null ? inList2 : Collections.emptyList());
// if there are too many entries, then leave; this handles
// cases of either list having > 1 element, or both lists having
// >= 1 element
if (! validNumberOfEntries(list1, list2)) {
return EHandled.NONE;
}
if (list1.size() == 1) {
return doSomethingWithIntList(list1);
}
else if (list2.size() == 1) {
return doSomethingWithStringList(list2);
}
else {
// should never happen; could also be handled by an assert
System.err.println("Something wicked this way comes");
return EHandled.ERROR;
}
}
/**
* If the total of the two lists is > 1, then there are too many entries;
* if the total == 0, there are not enough
* @param list1 A non-null list
* @param list2 A non-null list
*/
public boolean validNumberOfEntries(List<Integer> list1, List<String> list2)
{
int s1 = list1.size();
int s2 = list2.size();
return (s1 + s2 == 1);
}
public EHandled doSomethingWithIntList(List<Integer> list)
{
System.out.println("Processing Integers");
for (Integer i : list) {
System.out.println(i);
}
return EHandled.INTEGERS;
}
public EHandled doSomethingWithStringList(List<String> list)
{
System.out.println("Processing Strings");
for (String s : list) {
System.out.println(s);
}
return EHandled.STRINGS;
}
private enum EHandled
{
NONE,
INTEGERS,
STRINGS,
ERROR,
}
示例输出:
处理整数
1
处理字符串
Hello World