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;

    }

答案 1

使用 lambda 而不是方法引用。

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

答案 2

...我想知道是否可以将参数传递给deviceEvent.hasAlarm()this::sendSMS

不,是不可能的。使用方法引用时,只能传递一个参数 (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)  { ... }