Java 8 Map:过滤值并在找到匹配时抛出异常

问题描述 投票:0回答:4

我正在尝试在 Map 中查找匹配值,如果找到,我需要抛出 IllegalArgumentException。我的代码如下:

final String stringToBeMatched = "someRandomString"; 

map.values()
   .stream()
   .filter(a -> stringToBeMatched == a.getField())
   .findAny()
   .ifPresent(a -> throw new IllegalArgumentException());

我在标记“throw”上遇到语法错误。我不确定我哪里错了。

java lambda java-8
4个回答
32
投票

lambda 主体可以是表达式或语句块。 然而,

throw new IllegalArgumentException()

是一个陈述,但两者都不是。 用大括号将其包围起来,使其成为一个块。

.ifPresent(a -> {throw new IllegalArgumentException(); } );

对于下一个问题,将字符串值与

.equals
进行比较,而不是与
==
进行比较。


4
投票

替代清洁剂解决方案,使用

anyMatch

boolean found = map.values()
                   .stream()
                   .anyMatch(a -> stringToBeMatched.equals(a.getField()));
if(found) {
   throw new IllegalArgumentException();
}

3
投票

findAny 返回一个Optional,可以使用orElseThrow

map.values()
   .stream()
   .filter(a -> stringToBeMatched == a.getField())
   .findAny()
   .orElseThrow(() -> new IllegalArgumentException());

0
投票

您可以查看并抛出异常:

map.values()
    .stream()
    .peek(a -> {
        if (stringToBeMatched == a.getField()) {
            throw new RuntimeException("Expecting field to match: " + stringToBeMatched);
        }
    });
© www.soinside.com 2019 - 2024. All rights reserved.