簡體   English   中英

Java 8地圖流

[英]Java 8 map streams

有沒有辦法讓這段代碼使用Java 8?

public static boolean areBooleansValid(Map<String, Object> pairs, List<String> errors, String... values) {
    for (String value : values) {
        if (pairs.get(value) == null) {
            return false;
        } else if (!(pairs.get(value) instanceof Boolean)) {
            errors.add(value + " does not contain a valid boolean value");
            return false;
        }
    }
    return true;
}

想到這樣的事情:

Stream<Object> e = Stream.of(values).map(pairs::get);

但是如何讓它從這個流中返回不同的布爾值呢?

如果您只想過濾出布爾值並存在於pairs映射中的值,則可以應用過濾器函數:

Stream.of(values).filter(value ->  pairs.get(value) != null && pairs.get(value) instanceof Boolean)

或者,如果要實際返回truefalse值,可以使用map:

return Stream.of(values).allMatch(value -> {
            if (pairs.get(value) == null) {
                return false;
            }
            if ((pairs.get(value) instanceof Boolean)) {
                return true;
            }
            errors.add(value + " does not contain a valid boolean value");
            return false;
        });

我想你需要Just:

return Arrays.stream(values)
       .allMatch(value -> pairs.get(value) instanceof Boolean);

筆記

  • 我認為你的方法沒有任何error原因
  • 同樣@Andy Turner在注釋中提到對pairs.get(value) instanceof Boolean意味着pairs.get(value) != null所以你不需要使用pairs.get(value) != null

您可以使用與原始代碼完全相同的行為

public static boolean areBooleansValid(Map<String, Object> pairs,
                                       List<String> errors, String... values) {
    Optional<String> opt = Arrays.stream(values)
        .filter(s -> !(pairs.get(s) instanceof Boolean))
        .findFirst();
    opt .filter(s -> pairs.get(s) != null)
        .ifPresent(value -> errors.add(value+" does not contain a valid boolean value"));
    return !opt.isPresent();
}

就像您的原始代碼一樣,它只搜索第一個不是Boolean (可能為null ),但僅在值不為null時才添加錯誤。

    List<Object> errors = Stream.of(values)
        .filter(value -> value == null || !(pairs.get(value) instanceof Boolean))
        .collect(Collectors.toList());
    List<String> errorMsg = errors.stream().filter(Objects::nonNull)
        .map(value -> "" + pairs.get(value) + " does not contain a valid boolean value")
        .collect(Collectors.toList());
    errors.addAll(errorMsg);
return errors.isEmpty();

暫無
暫無

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

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