如果找不到元素,如何在java流中返回默认的布尔值?

mem*_*und 7 java string ignore-case optional java-stream

我想确定一个给定的字符串是否匹配 - 忽略大小写 - 一个元素中的一个List<String>.

我正在尝试使用Java 8流来实现这一点.这是我的尝试使用.orElse(false):

public static boolean listContainsTestWord(List<String> list, String search) {
    if (list != null && search != null) {
        return list.stream().filter(value -> value.equalsIgnoreCase(search))
          .findFirst().orElse(false);
    }
    return false;
}
Run Code Online (Sandbox Code Playgroud)

但那不会编译.

如何编码以返回是否找到匹配?

Tag*_*eev 6

用途Stream.anyMatch:

public static boolean listContainsTestWord(List<String> list, String search) {
    if (list != null && search != null) {
        return list.stream().anyMatch(search::equalsIgnoreCase);
    }
    return false;
}
Run Code Online (Sandbox Code Playgroud)


Tun*_*aki 5

您有一个错误,因为您的 Stream 管道由元素组成,因此findFirst()返回一个。因此,您不能使用参数进行调用(只有参数有效)。Optional<String>StringorElsebooleanString

您的问题的直接解决方案是使用

findFirst().isPresent();
Run Code Online (Sandbox Code Playgroud)

这样,如果findFirst()返回一个空的可选,isPresent()将返回false,如果没有,它将返回true

但最好采用@Tagir Valeev 的回答并使用anyMatch.


Boh*_*ian 5

这是单线的:

public static boolean listContainsTestWord(List<String> list, String search) {
    return list != null && search != null && list.stream().anyMatch(search::equalsIgnoreCase);
}
Run Code Online (Sandbox Code Playgroud)

甚至不用理会方法:

if (list != null && search != null && list.stream().anyMatch("someString"::equalsIgnoreCase))
Run Code Online (Sandbox Code Playgroud)