我是Java新手。我现在面临的一个问题是找不到最简单,最干净的解决方法。
假设我有3个参数(字符串)传递给一个函数(也可以是Hashmap)。我想检查单个变量或变量组合是否不是Null并采取相应措施。
例如,一种方法是使用if-else这种方式
if(a!=null && b == null && c == null) {
//doSomething
}
else if(a==null && b!= null && c == null ) {
//doSomething
}
else if(a==null && b0= null && c != null) {
//doSomething
}
......
//Similarly combination of two variables
if(a!=null && b != null && c == null) {
//doSomething
}
else if(a!=null && b== null && c != null) {
//doSomething
}
else if(a==null && b!= null && c != null) {
//doSomething
}
......
//and so on
//Similarly combination of three variables
if(a!=null && b != null && c != null) {
//doSomething
}
....
如何实现这种情况。我发现了类似的question,但没有使代码干净。任何帮助将不胜感激
答案 0 :(得分:7)
编写这些实用程序功能,就可以轻松比较n个项。
public static boolean areAllNull(Object... objects) {
return Stream.of(objects).allMatch(Objects::isNull);
}
public static boolean areAllNotNull(Object... objects) {
return Stream.of(objects).allMatch(Objects::nonNull);
}
您可以将这些功能用于n次比较。
if(areAllNotNull(a) && areAllNull(b,c)) {
//doSomething
}
else if(areAllNotNull(b) && areAllNull(a,c)) {
//doSomething
}
else if(areAllNotNull(c) && areAllNull(b,a)) {
//doSomething
}
答案 1 :(得分:2)
这是我的解决方案。请注意,在一个方法中您有多个if...else
。然后添加doSomething
。这将是可怕的准备,后来又意识到。
将一个条件转移到单独的方法中并用相对名称命名的情况。然后,将其封装到Consumer
中并将其全部封装到预定义列表中。以后,如果您的doSomething
很大,则可以从单个方法转到单个类,而无需修改客户端代码。
这是一个类,用于收集条件所需的变量:
final class Data {
private final String a;
private final String b;
private final String c;
}
然后在Consumer
语句中每个定义一个if
:
Consumer<Data> wonderfulConsumer = data -> {
if (a != null && b == null && c == null) {
// do something for wonderful consumer
}
};
Consumer<Data> badLuckConsumer = data -> {
if (a == null && b != null && c == null) {
// do something for bad luck consumer
}
};
注意,所有这些使用者都可以单独修改(即使在不同的类中也可以)。
然后在客户端代码中,定义所有已知使用者的列表:List<Consumer<Data>> consumers = Arrays.asList(wonderfulConsumer, badLuckConsumer)
。
最后,您的方法将是这样,当您决定修改或添加使用者时,无需更改它。
Data data = new Data(a, b, c);
consumers.forEach(consumer -> consumer.accept(data));
答案 2 :(得分:0)
如果必须这样做,我将以与您相同的方式进行。 但是,如果您不喜欢它,并且如果您认为它不可读,则可以通过这种方式进行操作,我希望对此答案有很多负面评论,因为这是一个糟糕的解决方案。
public static void yourMethod(Object a,Object b,Object c)
{
int evaluation = howManyNotNull(a,b,c);
if(evaluation == 0) // all are nulls
{
// your code
}
else if(evaluation == 1) // only one is not null
{
if(a!=null)
{
}
else if(b!=null)
{
}
else
{
// c not null
}
}
else if(evaluation == 2) // two variables are not null but other one is null
{
if(a==null)
{
}
else if(b == null)
{
}
else
{
// c is null, a and b not null
}
}
else
{
// all abc not null
}
}
private static int howManyNotNull(Object a, Object b, Object c)
{
return (a==null?0:1) + (b==null?0:1) + (c==null?0:1);
}
有此版本的扩展版本,为a,b,c分配3个质数(例如:a = 2,b = 3,c = 5),然后使用类似的支持方法
private static int convertAvailabilityToInt(Object a, Object b, Object c)
{
return (a==null?1:2) * (b==null?1:3) * (c==null?1:5);
}
如果答案为1,则所有结果都不为空。
答案 3 :(得分:-1)
例如,您可以使用模拟3个标志的3位数字字符串。 您首先将其设置为“ 000”。 然后检查每个变量是否为null,如果不是,则将0替换为1。 然后,您可以使用切换案例处理每个案例。
答案 4 :(得分:-2)
您所做的一切正确,但必须记住原始数据类型不能为null。例如,字符串不为null,但空字符串“”或int不能为null,默认情况下其设置为0。结论Map
,ArrayList
或Integer
之类的对象。可以检查是否为空,但是原始数据类型不能为空,因此您无法对其进行检查。为了更深入地了解,只需了解原始和高级数据类型。
希望我能解决您的问题:)