Я использую вызов функции - это фильтр в потоке, как показано ниже -

list.stream()
        .filter(a -> !StringUtils.isEmpty(a.getProp1()))
        .filter(a -> !a.getProp1().matches(“(.*)xyz"))
        .filter(a -> {try {
                        return isValid(a.getProp1());
                    } catch (javax.naming.NamingException e) {
                        logger.error("Error");
                    }
                    })

Я сослался на вопрос, но я не хотите выбросить исключение в блоке catch. Я просто хочу это записать.

Я хочу сохранить записи, которые возвращают истину при вызове isValid (a), а затем иметь возможность собирать их в HashSet, как показано ниже -

 //   .collect(Collectors.toCollection(HashSet::new));

Это должно быть очевидно из кода, но я новичок в java 8 и все еще изучаю концепции. Простите за наивный код. Спасибо за любую помощь.

1
maddie 19 Июл 2017 в 19:53
В третьем фильтре, когда вы поймаете свое исключение, должен быть отфильтрован «а» или нет? Не пропустил "return false" или что-то в этом роде?
 – 
fairtrax
19 Июл 2017 в 20:01

1 ответ

Лучший ответ

Если во время фильтрации метод isValid выдает javax.naming.NamingException, помимо регистрации исключения, вы можете захотеть вернуть false:

Set<Whatever> result = list.stream()
    .filter(a -> !StringUtils.isEmpty(a.getProp1()))
    .filter(a -> !a.getProp1().matches("(.*)xyz"))
    .filter(a -> {
        try {
            return isValid(a.getProp1());
        } catch (javax.naming.NamingException e) {
            logger.error("Error");
            return false;
        }})
    .collect(Collectors.toCollection(HashSet::new));

Это связано с тем, что аргумент Predicate, переданный методу Stream.filter, всегда должен возвращать логическое значение, независимо от того, перехватило ли оно исключение или нет.

2
fps 19 Июл 2017 в 20:11
В этом есть смысл, даже после добавления return false я не могу собрать список, который является arrayylist, в hashSet. Я получаю сообщение об ошибке компиляции: «Неверный тип возвращаемого значения в ссылке на метод.
 – 
maddie
19 Июл 2017 в 20:05
Set<String> mySet = new HashSet<>(); mySet = list.stream() .filter(a -> !StringUtils.isEmpty(a.getProp1())) .filter(a -> !a.getProp1().matches(“(.*xyz”)) .filter(a -> {try { return isValid(a.getProp1()); } catch (javax.naming.NamingException e) { logger.error("Error"); return false; } }) .collect(Collectors.toCollection(HashSet::new)); Это мой последний код.
 – 
maddie
19 Июл 2017 в 20:05
Пожалуйста, проверьте, работает ли он после моего последнего редактирования. Другая странная вещь, которую я заметил, - это использование типографских кавычек во втором filter(...) ...
 – 
fps
19 Июл 2017 в 20:06
1
Да, вы угадали, я исправлю. Я предполагаю, что в этом случае я переназначу измененный список в список самого себя. Огромное спасибо.
 – 
maddie
19 Июл 2017 в 20:12
1
Я действительно добавил .map(a -> a.getProp1()) после всех фильтров. я могу собрать его как HashSet . Спасибо!
 – 
maddie
19 Июл 2017 в 20:14