Java 8使用参数流映射

时间:2017-06-30 13:48:42

标签: java lambda functional-programming java-8 java-stream

我有这几个函数,我想知道是否可以将参数.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}}

3 个答案:

答案 0 :(得分:19)

使用lambda而不是方法引用。

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

答案 1 :(得分:5)

  

...我想知道是否可以将参数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)  { ... }

答案 2 :(得分:0)

如果参考方法属于同一类,如何创建一个可用的类或成员并为其分配值并在提供的参考方法中重复使用