更优雅的实现方式
More elegant way to implement
ArrayList<Boolean> values = new ArrayList<>(Arrays.asList(true, false, true, false, false, true));
List<String> filter = Arrays.asList("TRUE");
List<String> filter = Arrays.asList("FALSE");
List<String> filter = Arrays.asList("TRUE","FALSE");
if (!filter.isEmpty()) {
List<Boolean> collect = values.stream()
.filter(i -> i ? filter.contains("TRUE") : filter.contains("FALSE"))
.collect(Collectors.toList());
System.out.println(collect);
} else { System.out.println(values);}
使用过滤器值 TRUE
、FALSE
或 TRUE,FALSE
我得到了想要的结果 [true, true, true]
、[false, false, false]
和 [true, false, true, false, false, true]
。如果过滤器为空,列表应按原样返回。 "TRUE" 或 "FALSE" 可以表示任何字符串..
有没有更优雅的实现方式?
如果过滤器真的只能是4个有效组合,那么你可以作弊:
if (filter.size() == 1) {
Boolean removeTrue = filter.contains("FALSE");
values.removeIf(removeTrue::equals);
}
System.out.println(values);
我不确定这里的目标是什么,但优雅可能在旁观者的眼中,所以,给你。
public static void main(String[] args) {
System.out.println(go(
Arrays.asList(true, false, true, false, false, true),
Arrays.asList("TRUE")));
}
static List<Boolean> go(final List<Boolean> values, final List<String> filter) {
if (filter.isEmpty())
return values;
return values
.stream()
.filter(i -> filter.contains(i.toString().toUpperCase()))
.collect(Collectors.toList());
}
您可以:
- 测试谓词内部是否为空(极小的性能成本)
- 使用三元作为包含值
从而消除了 if-else
和对 contains()
的额外调用:
List<Boolean> collect = values.stream()
.filter(i -> filter.isEmpty() || filter.contains(i ? "TRUE" : "FALSE"))
.collect(Collectors.toList());
System.out.println(collect);
ArrayList<Boolean> values = new ArrayList<>(Arrays.asList(true, false, true, false, false, true));
List<String> filter = Arrays.asList("TRUE");
List<String> filter = Arrays.asList("FALSE");
List<String> filter = Arrays.asList("TRUE","FALSE");
if (!filter.isEmpty()) {
List<Boolean> collect = values.stream()
.filter(i -> i ? filter.contains("TRUE") : filter.contains("FALSE"))
.collect(Collectors.toList());
System.out.println(collect);
} else { System.out.println(values);}
使用过滤器值 TRUE
、FALSE
或 TRUE,FALSE
我得到了想要的结果 [true, true, true]
、[false, false, false]
和 [true, false, true, false, false, true]
。如果过滤器为空,列表应按原样返回。 "TRUE" 或 "FALSE" 可以表示任何字符串..
有没有更优雅的实现方式?
如果过滤器真的只能是4个有效组合,那么你可以作弊:
if (filter.size() == 1) {
Boolean removeTrue = filter.contains("FALSE");
values.removeIf(removeTrue::equals);
}
System.out.println(values);
我不确定这里的目标是什么,但优雅可能在旁观者的眼中,所以,给你。
public static void main(String[] args) {
System.out.println(go(
Arrays.asList(true, false, true, false, false, true),
Arrays.asList("TRUE")));
}
static List<Boolean> go(final List<Boolean> values, final List<String> filter) {
if (filter.isEmpty())
return values;
return values
.stream()
.filter(i -> filter.contains(i.toString().toUpperCase()))
.collect(Collectors.toList());
}
您可以:
- 测试谓词内部是否为空(极小的性能成本)
- 使用三元作为包含值
从而消除了 if-else
和对 contains()
的额外调用:
List<Boolean> collect = values.stream()
.filter(i -> filter.isEmpty() || filter.contains(i ? "TRUE" : "FALSE"))
.collect(Collectors.toList());
System.out.println(collect);