[英]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)
或者,如果要實際返回true
和false
值,可以使用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
原因 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.