(Predicates) или (Строка s) - PullRequest
       46

(Predicates) или (Строка s)

0 голосов
/ 22 февраля 2019

У меня есть TreeSet строк (в жестком коде).Хотите проверить, что задан параметр String, например.«Персона», если присутствует в TreeSet, затем возвращает true, иначе возвращает false.

Здесь меня смущает сообщение Eclipse относительно (Predicate<? super String> s) против (String s):

Метод anyMatch (Predicate) в типе Stream не применим для аргументов (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;
    }
}

Ответы [ 3 ]

0 голосов
/ 22 февраля 2019

Проблема в вашем решении заключается в следующей строке:

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

}
0 голосов
/ 22 февраля 2019

Подпись 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");
}
0 голосов
/ 22 февраля 2019

Здесь нет необходимости использовать Predicate .Чтобы проверить, присутствует ли String в вашем TreeSet, просто используйте:

return systemLabels.contains("Person");

Если вы все еще настаиваете на использовании anyMatch , тогда выможет сделать:

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

Помните, выражение предиката должно быть оценено как логическое значение, но в коде вы передаете строку отсюда ошибка компиляции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...