基于对象的多个propety值的Buisld字符串

时间:2018-01-12 06:17:53

标签: java

我有一个具有三个布尔值的对象,并且根据它们的值,我必须构建一个字符串。现在我正在使用的方法是:

if(a)
    string.append("a");
if(string.len!=0) {
    if(b) {
        if(c) {
            string.append(", ").append("b").append(" and ").append("c");
        }
        else {
            string.append(" and ").append("b");
        }
    }
    else {
        //check for c and add "and" string appropriately
    }
}

// then again an else part when string length is not zero and I check these values again

有更好的方法吗?

这段代码对我有用

final String result = Arrays.asList(values).stream()
            .filter(o -> o != null)
            .distinct()
            .collect(Collectors.joining(", ")) 
            .replaceAll(", (a|b|c)$", " and $1");     

2 个答案:

答案 0 :(得分:1)

假设您要输出类似a, b and c的内容(请参阅我的评论),这样做可以解决问题:

final boolean a = true, b = true, c = true;
final String[] values = new String[] {a ? "a" : null, b ? "b" : null, c ? "c" : null};
final String result = Arrays.asList(values).stream()
        .filter(o -> o != null) // discard all null (false) values in the list
        .collect(Collectors.joining(", ")) // join all elements by concatenating with ','
        .replaceAll(", (a|b|c)$", " and $1"); // replace last ',' with 'and'

性能方面,这可能比您的代码差一些,因为它首先构建一个以逗号分隔的字符串,并用,替换最后的and,但在您的情况下差异应该可以忽略不计。< / p>

答案 1 :(得分:0)

我没有真正得到你想要的输出,所以我建议一些代码片段。

请注意:我的解决方案仅在您愿意根据boolean值创建列表时才有效。

所以如果你有(让我们再添加一些......)

boolean a = true;
boolean b = false;
boolean c = true;
boolean d = false;
boolean e = false;
boolean f = true;
boolean g = true;
boolean h = true;
boolean i = false;
boolean j = true;

第一步是创建List<Boolean>

final List<Boolean> values = Arrays.asList(a, b, c, d, e, f, g, h, i, j);

现在让我们看看不同的情况:

您只想打印true

String output1 = values.stream()    // create stream
            .filter(bool -> bool)       // accept only true values
            .map(Object::toString)     // transform to string 
            .collect(Collectors.joining(", ")); // append everything with a comma

输出:true, true, true, true, true, true

但这并不意味着什么。你不知道哪些值是true,所以这可能不是你想要的。

您希望仅使用索引打印true值:

final String output2 = IntStream.range(0, values.size())    // generate integers from 0 to N
            .filter(values::get)                                // get only positives
            .mapToObj(idx -> idx + ": " + values.get(idx))      // generate string 'n: bool'
            .collect(Collectors.joining(", "));         // append

输出:0: true, 2: true, 5: true, 6: true, 7: true, 9: true

您可能需要char值而不是integer索引

当您mapToObj时,您可以将integer索引转换为ASCII字符

.mapToObj(idx -> Character.valueOf((char) (97 + idx)).toString() + ": " + values.get(idx))

输出:a: true, c: true, f: true, g: true, h: true, j: true

您只想打印索引/字符是真的

final String output3 = IntStream.range(0, values.size())
            .filter(values::get)
            .mapToObj(Integer::toString)
            .collect(Collectors.joining(", "));

输出:0, 2, 5, 6, 7, 9

使用.mapToObj(idx -> Character.valueOf((char) (97 + idx)).toString())

输出:a, c, f, g, h, j

现在最后一部分是将,更改为and字面值。

我无法想出任何其他事情:

int lastComma = output3.lastIndexOf(",");
String newOuput = new StringBuilder(output3).replace(lastComma, lastComma + 2, " and ").toString();

输出:0, 2, 5, 6, 7 and 9