簡體   English   中英

更優雅的實現方式

[英]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 , FALSETRUE,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);

你可以:

  1. 測試謂詞內的空性(無法衡量的小性能成本)
  2. 對 contains 值使用三元組

因此消除了if-else和對contains()的額外調用:

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

System.out.println(collect);

我不確定這里的目標是什么,但優雅可能會出現在旁觀者的眼中,所以,你去吧。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM