(Predicate<? super String> s) 或者 (String s)

8

我有一个字符串的TreeSet(硬编码)。

想要检查给定的参数字符串,例如“Person”,是否出现在TreeSet中,如果存在则返回true,否则返回false

这里我在Eclipse信息上感到困惑:

(Predicate<? super String> s)(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;
    }
}

2
这里我对Eclipse关于((Predicate s)或(String s))的信息感到困惑:是什么信息? - ernest_k
@azurefrog ? super String 可以有很多意义,例如它可以允许传递 CharSequence - Turing85
1
@ernest_k 在 Stream<String> 类型中,方法 anyMatch(Predicate<? super String>) 不适用于参数 (String)。如果我使用 String 作为参数,则在 Streaming 时会收到此 Eclipse 消息。 - Optimight
3个回答

10

这里不需要使用Predicate。为了检查TreeSet中是否存在String,只需使用以下代码:

return systemLabels.contains("Person");
如果您仍然坚持使用 anyMatch,则可以执行以下操作:
public static boolean validateSystemLabel(String s) {
    return systemLabels.stream().anyMatch(i -> i.equals(s));
}

请记住,谓词表达式需要评估为一个布尔值,但在代码中,您传入了一个字符串,因此编译错误。


第一个满足目的。在这两个解决方案中,哪一个更有效率? - Optimight
在我看来,第一种解决方案是最好的,因为这里不需要使用流。 - Nicholas K
1
@Optimight 考虑在您的代码中使用 TreeSet,使用 contains 进行最坏情况查找时间将为 O(logn)。另一方面,如果您使用流解决方案,则可能只需遍历集合中的所有元素,这意味着运行时为 O(n)。此外,请注意,如果您只使用无序集合(例如 HashSet),则复杂度可能仅为 O(1),因为它只需要进行哈希码比较和查找到支持它的哈希映射中。 - Naman

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

}

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接