web-dev-qa-db-fra.com

Java 8 cartes de flux avec paramètres

J'ai ce couple de fonctions et je voudrais savoir s'il est possible de passer le paramètre deviceEvent.hasAlarm() à .map(this::sendSMS)

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;

    }
10
La Carbonell

Utilisez un lambda au lieu de la référence de méthode.

// ...
.map(n -> sendSMS(n, deviceEvent))
// ...
24
Andy Turner

... je voudrais savoir s'il est possible de passer le paramètre deviceEvent.hasAlarm() à this::sendSMS

Non, ce n'est pas possible. Lorsque vous utilisez la référence de méthode, vous ne pouvez transmettre qu'un seul argument ( docs ).

Mais à partir du code que vous avez fourni, il n'y a pas besoin d'une telle chose. Pourquoi vérifier deviceEvent pour chaque notification lorsqu'elle ne change pas? Meilleure façon:

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

Quoi qu'il en soit, si vous le voulez vraiment, cela peut être une solution:

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)  { ... }
5
Adrian