(谓词<!-?超级字符串-> s)或(字符串s)

时间:2019-02-22 18:09:39

标签: java string java-8 java-stream predicate

我有一个TreeSet的字符串(硬编码)。 要检查给定的参数String例如。如果“人”出现在TreeSet中,则返回true,否则返回false

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

  

Stream类型的方法anyMatch(Predicate)不适用于参数(字符串)

请指导。

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

3 个答案:

答案 0 :(得分:10)

此处无需使用谓词。为了检查您的TreeSet中是否存在 String ,只需使用:

return systemLabels.contains("Person");

如果您仍然坚持使用 anyMatch ,则可以执行以下操作:

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

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

答案 1 :(得分:2)

解决方案中的问题是此行:

SystemLabels.stream().anyMatch(j);

基本上anyMatch()期望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);
    }

}

答案 2 :(得分:1)

anyMatch的签名是

boolean anyMatch(Predicate<? super T> predicate)

在您的情况下,参数必须为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");
}