具有不同类型对象的Java比较列表

时间:2018-04-10 05:02:07

标签: java collections java-8

我有两个包含不同类型对象的列表。列表可以:

  1. 是空的。
  2. 不是空的,但可能没有任何元素。
  3. 可以只有一个元素。
  4. 可以有多个元素。
  5. 只有当列表中只有一个元素而不是两个元素时,我才需要做一些操作。示例代码将是这样的:

    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库?谢谢!

2 个答案:

答案 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

相关问题