web-dev-qa-db-ja.com

Javaパラメーター付き8ストリームマップ

この関数がいくつかあり、パラメータ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

メソッド参照の代わりにラムダを使用します。

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

...パラメータdeviceEvent.hasAlarm()this::sendSMSに渡すことが可能かどうかを知りたい

いいえ、できません。メソッド参照を使用する場合、渡すことができる引数は1つだけです( docs )。

しかし、あなたが提供したコードからは、そのようなことは必要ありません。通知が変更されていないときにすべての通知に対してdeviceEventをチェックする理由より良い方法:

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

とにかく、本当に望むなら、これは解決策になることができます:

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