Java 8地图流

时间:2018-10-26 10:09:06

标签: java java-8 java-stream

是否有一种方法可以使此代码使用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);

但是如何获取它以从此流中返回不同的布尔值?

4 个答案:

答案 0 :(得分:3)

如果只想过滤出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;
        });

答案 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();