我有一个具有三个布尔值的对象,并且根据它们的值,我必须构建一个字符串。现在我正在使用的方法是:
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");
答案 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