Java 8 карта потоков - PullRequest
       22

Java 8 карта потоков

0 голосов
/ 26 октября 2018

Есть ли способ заставить этот код использовать 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 голосов
/ 26 октября 2018

Вы можете воспроизвести точно такое же поведение, что и исходный код, используя

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.

0 голосов
/ 26 октября 2018

Я думаю, вам нужно просто:

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
0 голосов
/ 26 октября 2018
    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();
0 голосов
/ 26 октября 2018

Если вы просто хотите отфильтровать значения, которые являются булевыми и присутствуют на карте pairs, вы можете применить функцию фильтра:

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

Или, если вы действительно хотите вернуть true иfalse значений, вы можете использовать карту:

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