2017-12-10 5 views
3

Ich möchte alle Übertragungen filtern, für die das signedOn Feld null ist. Wenn ich den ersten Code ausführe, ist es klar, welche null sind und welche nicht und sie sind korrekt geloggt, aber wenn ich den Stream-Filter starte, gibt es eine leere Liste zurück und ich kann nicht finden, wo das Problem liegt it ... signedOn ist ein Datumsfeld.Java 8 Stream Filter gibt immer eine leere Liste zurück

Dies funktioniert und protokolliert alle, ob die Einträge sind null oder nicht:

for (Transfer transfer : route.getTransferCollection()) { 
     if (transfer.getSignedOn() == null) { 
      logInfo("This transfer is null"); 
     } else if (transfer.getSignedOn() != null) { 
      logInfo("This transfer is not null"); 
     } 
    } 

Dies gibt eine leere Liste:

return route.getTransferCollection() 
      .stream() 
      .filter(transfer -> transfer.getSignedOn() == null) 
      .collect(Collectors.toList()); 
} 
+0

Was ist der Rückgabetyp von 'getTransferCollection()'? – Harald

+0

Wie wäre es mit einer Log-Anweisung innerhalb 'filter'? – Eugene

+0

@Harald es ist eine Sammlung brightpants

Antwort

2

Sie Ihre Aussagen selbst

innerhalb des filter anmelden können
return route.getTransferCollection() 
     .stream() 
     .filter(transfer -> { 
       boolean test = transfer.getSignedOn() == null; 
       if(test){ 
        // log wathever 
       } else { 
        // log diff 
       } 
       return test 
       }) 
     .collect(Collectors.toList()); 

Sie können peek verwenden, um innerhalb von Streams BTW zu protokollieren, aber mit In Ihrem Fall müsste zweimal gegen null getestet werden.

Sie können auch einen anderen Sammler verwenden kann, um die zu bekommen, die für null und diejenigen, die nicht sind (ohne filter):

.collect(Collectors.partitioningBy(transfer -> transfer.getSignedOn() == null)) 
+0

Ich habe es genau so versucht, aber es loggt überhaupt nichts:/Ich habe keine Ahnung, was los ist, also habe ich es für etwas ziemlich primitive wie ein für das hinzugefügt, um eine andere Liste hinzuzufügen, wenn es null ist, weil es Sonntag und ich bin Willst du nach Hause gehen? – brightpants

+2

@brightpants das ist wirklich seltsam, aber ohne deinen Code zu sehen, es ist schwer zu sagen, was vor sich geht. Vielleicht kann ich morgen genau sehen, was morgen vor sich geht (das Überprüfen Ihres Codes ist immer gut IMO) – Eugene

+1

Es gibt zwei Möglichkeiten, dass das Ergebnis leer ist: 'route.getTransferCollection() 'ist bereits leer, oder alle Transfers haben ein signedOnDate (Beachten Sie, dass Filter definiert, welche Elemente beibehalten werden sollen, nicht welche zu entfernen sind). Vielleicht könnten Sie die Größe von 'route.getTransferCollection()' vor dem Stream protokollieren, um festzustellen, ob dieser leer ist. –

2

Es scheint, als ob route.getTransferCollection() bereits eine leere Liste ist. Bitte versuchen Sie es wie folgt zu überprüfen:

route.getTransferCollection() 
    .stream() 
    .forEach(System.out::println); // or .forEach(e -> logInfo(e)); 

und sehen, ob dies nichts drucken wird.

+8

In diesem Beispiel wird definitiv nichts gedruckt. Sie haben in Ihrem Stream keine Terminaloperation. –

+0

Meine schlechte, veränderte 'Peek' zu' forEach'. Danke, @ Brian Goetz! – PresentProgrammer

Verwandte Themen