是否有一种方法可以使此代码使用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);
但是如何获取它以从此流中返回不同的布尔值?
答案 0 :(得分:3)
如果只想过滤出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;
});
答案 1 :(得分:3)
我认为您只需要:
return Arrays.stream(values)
.allMatch(value -> pairs.get(value) instanceof Boolean);
注释
error
的任何原因pairs.get(value) instanceof Boolean
中的@Andy Turner所暗示的是pairs.get(value) != null
,因此您无需使用pairs.get(value) != null
答案 2 :(得分:2)
您可以使用
重现与原始代码完全相同的行为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
时才会添加错误
答案 3 :(得分:0)
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();