2017-06-30 3 views
2

Ich habe dieses paar Funktionen, und ich würde gerne wissen, ob es möglich ist, die Parameter deviceEvent.hasAlarm() zu .map(this::sendSMS)Java 8 Streams Karten mit Parametern

private void processAlarm (DeviceEvent deviceEvent) { 

     notificationsWithGuardians.stream() 
        .filter (notification -> notification.getLevels().contains(deviceEvent.getDeviceMessage().getLevel())) 
        .map(this::sendSMS) 
        .map(this::sendEmail); 

    } 

    private DeviceAlarmNotification sendSMS (DeviceAlarmNotification notification, DeviceEvent deviceEvent) { 

     if (deviceEvent.hasAlarm()) {  

     } 

     return notification; 

    } 

Antwort

11

Verwenden Sie einen Lambda anstelle der Methode Referenz zu übergeben.

// ... 
.map(n -> sendSMS(n, deviceEvent)) 
// ... 
3

... würde ich gerne wissen, ob es möglich ist, die Parameter deviceEvent.hasAlarm() zu this::sendSMS

, ist nicht möglich Keine passieren. Bei Verwendung der Methodenreferenz können Sie nur ein Argument übergeben (docs).

Aber von dem Code, den Sie zur Verfügung gestellt haben, gibt es keine Notwendigkeit für so etwas. Warum sollte man deviceEvent für jede Benachrichtigung überprüfen, wenn sie sich nicht ändert? bessere Art und Weise:

if(deviceEvent.hasAlarm()) { 
    notificationsWithGuardians.stream().filter(... 
} 

Wie auch immer, wenn Sie wirklich wollen, kann dies eine Lösung sein:

notificationsWithGuardians.stream() 
       .filter (notification -> notification.getLevels().contains(deviceEvent.getDeviceMessage().getLevel())) 
       .map(notification -> Pair.of(notification, deviceEvent)) 
       .peek(this::sendSMS) 
       .forEach(this::sendEmail); 

private void sendSMS(Pair<DeviceAlarmNotification, DeviceEvent> pair) { ... }