2017-05-02 2 views
2

ich versuchte, den Körper eines Verfahrens boolean exists(String value, boolean isCaseSensitive) zu konvertieren:Java 8 Verfahren Bezug auf: entweder `` equals` oder equalsIgnoreCase`

for(String str : existingNames){ 
     if(isCaseSensitive ? str.equals(name) : str.equalsIgnoreCase(name)){ 
      return true; 
     } 
    } 

    return false; 

zu einer Lösung, die Referenzen java8 Verfahren verwendet:

Predicate<String> equalityPred = isCaseSensitive ? 
      name::equals : 
      name::equalsIgnoreCase; 

    return existingNames.stream().anyMatch(equalityPred); 

Dann sah ich, dass auf diese Weise die Gleichheit in die entgegengesetzte Richtung (zB value.equals(str)) durchgeführt wird.
Gibt es eine Möglichkeit, dies zu beheben und immer noch Methodenverweise zu verwenden, und wenn nein, was würde der Java8 Weg sein.

+2

Was ist das Problem mit 'str.equals (value)' oder 'value.equals (str)'? Wenn eines der beiden wahr ist, dann muss das andere auch wahr sein. –

+0

@Ousmane Mahy Diaw ein möglicher Fall könnte sein, dass die Methode null Werte akzeptiert, aber die Sammlung wird nie enthalten. –

Antwort

4

Es gibt keine „Gegenrichtung“ für die Gleichstellung ist. Das einzige Problem könnte das Verhalten für null Werte sein. Ihre Schleife schlägt möglicherweise fehl, wenn die Sammlung null enthält, schlagen Ihre Methodenreferenzen fehl, wenn namenull ist.

Sie können das ursprüngliche Verhalten unter Verwendung von Lambda-Ausdrücke erreichen:

boolean check(Collection<String> existingNames, String name, boolean isCaseSensitive) { 
    Predicate<String> equalityPred = isCaseSensitive? 
     s -> s.equals(name): 
     s -> s.equalsIgnoreCase(name); 

    return existingNames.stream().anyMatch(equalityPred); 
} 

aber es macht wenig Sinn null für die name Parameter zu berücksichtigen, wenn es nie gleich sein wird, da der Code mit einem NullPointerException fehl, wenn die Sammlung null enthält.

Um ein vernünftiges Verhalten für null erhalten Sie

boolean check(Collection<String> existingNames, String name, boolean isCaseSensitive) { 
    Predicate<String> equalityPred = name==null? Objects::isNull: 
     isCaseSensitive? name::equals: name::equalsIgnoreCase; 

    return existingNames.stream().anyMatch(equalityPred); 
} 

oder nur

boolean check(Collection<String> existingNames, String name, boolean isCaseSensitive) { 
    return name==null || isCaseSensitive? 
     existingNames.contains(name): 
     existingNames.stream().anyMatch(name::equalsIgnoreCase); 
} 

Wenn Sie, dass die Sammlung kennen verwenden kann nie null enthalten wird, wollen aber null für die name unterstützen Parameter, Sie könnten auch

verwenden 0
3

ist eine gute Methode Referenz nicht dann verwenden und Ihr Lambda schreibt direkt:

 static boolean existsJDK8(List<String> existingNames, String value, boolean isCaseSensitive) { 
     Predicate<String> equalityPred = isCaseSensitive ? s -> value.equals(s) : s -> value.equalsIgnoreCase(s); 

     Predicate<String> equalityPredReversed = isCaseSensitive ? s -> s.equals(value) : s -> s.equalsIgnoreCase(value); 

     // return existingNames.stream().anyMatch(equalityPredReversed); 
     return existingNames.stream().anyMatch(equalityPred); 
    }