当前位置: 代码迷 >> java >> (谓语 s)或(String s)
  详细解决方案

(谓语 s)或(String s)

热度:67   发布时间:2023-08-04 09:13:55.0

我有一个TreeSet of Strings(硬编码)。 想要检查给定的参数String例如。 “Person”如果存在于TreeSet中则返回true否则返回false

这里我对Eclipse消息(Predicate<? super String> s) vs (String s)感到困惑:

类型Stream中的方法anyMatch(Predicate)不适用于参数(String)

请指导。

import java.util.Set;
import java.util.TreeSet;
import java.util.function.Predicate;

public class SystemLabelValidator {

    public static boolean ValidateSystemLabel( String s) {  

        String j = s;

        boolean b = false;

        Set <String> SystemLabels = new TreeSet<String>();
        // Unique Strings
        SystemLabels.add("Person");
        SystemLabels.add("Player");
        SystemLabels.add("Hospital");
        SystemLabels.add("Nurse");
        SystemLabels.add("Room");

        System.out.println("\n==> Loop here.");
        for (String temp : SystemLabels) {
            System.out.println(temp);

            if(SystemLabels.stream().anyMatch(j)) {
                System.out.println("I need to return Boolean");
            }
            return b;
        }
        return b;
    }
}

这里没有必要使用谓词 为了检查TreeSet是否存在String ,只需使用:

return systemLabels.contains("Person");

如果您仍坚持使用anyMatch,那么您可以:

public static boolean validateSystemLabel(String s) {
    return systemLabels.stream().anyMatch(i -> i.equals(s));
}

请记住, 谓词表达式需要求值为布尔值,但在代码中,您传入的是String,因此编译错误。

您的解决方案中的问题是这一行:

SystemLabels.stream().anyMatch(j);

基本上期望Predicate作为输入而不是String

但是你的问题有更简单的解决方案:

import java.util.Set;
import java.util.TreeSet;

public class SystemLabelValidator {

    private static final Set<String> SYSTEM_LABLES = new TreeSet<>(Arrays.asList("Person", "Player", "Hospital", "Nurse", "Room"));

    public static boolean validateSystemLabel( String value) {  
        return SYSTEM_LABLES.contains(value);
    }

}

anyMatch的签名是

boolean anyMatch(Predicate<? super T> predicate)

在你的情况下,参数必须是Predicate<? super String> Predicate<? super String> 也就是说,一个可以获取字符串并返回布尔值的方法。 此方法正在寻找以下之一

Predicate<String> (e.g. String::isEmpty)
Predicate<Object> (e.g. Objects::isNull)
Predicate<CharSequence>
Predicate<Comparable<String>>
Predicate<Serializable>

您试图给它一个字符串,它与签名不匹配。 解决这个问题的一种方法是:

if(SystemLabels.stream().anyMatch(j::equals)) {
    System.out.println("I need to return Boolean");
}
  相关解决方案