更优雅的实施方式

时间:2019-12-19 23:11:01

标签: java java-stream predicate

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);}

使用过滤器值TRUEFALSETRUE,FALSE,可以得到所需的结果[true, true, true][false, false, false][true, false, true, false, false, true]。如果过滤器为空,则应按原样返回列表。 “ TRUE”或“ FALSE”可以代表任何字符串。

是否有更优雅的实施方式?

3 个答案:

答案 0 :(得分:2)

如果过滤器实际上只能是4个有效组合,那么您可以作弊:

if (filter.size() == 1) {
    Boolean removeTrue = filter.contains("FALSE");
    values.removeIf(removeTrue::equals);
}
System.out.println(values);

答案 1 :(得分:1)

您可以:

  1. 测试谓词中的空度(不可估量的执行成本)
  2. 将三元数用作包含值

因此消除了if-else和对contains()的额外调用:

List<Boolean> collect = values.stream()
        .filter(i -> filter.isEmpty() || filter.contains(i ? "TRUE" : "FALSE"))
        .collect(Collectors.toList());

System.out.println(collect);

答案 2 :(得分:0)

我不确定这里的目标是什么,但是情人在旁观者的眼中可能是这样,

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());
}
相关问题