Java 8集合:带功能的过滤器不起作用

时间:2018-01-29 14:36:49

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

我有这段代码,要从具有某种条件

的DeviceEvents列表中提取
List<DeviceEvent> deviceEvents = new ArrayList<>();

        deviceEventService
            .findAll(loggedInUser())
            .filter(this::isAlarmMessage)   
            .iterator() 
            .forEachRemaining(deviceEvents::add);


private boolean isAlarmMessage (DeviceEvent deviceEvent) {

        return AlarmLevelEnum.HIGH == deviceEvent.getDeviceMessage().getLevel();
    }

但是我收到了这个编译错误:

The method filter(this::isAlarmMessage) is undefined for the type 
 Iterable<DeviceEvent>
  • findAll返回Iterable<DeviceEvent>

1 个答案:

答案 0 :(得分:8)

应在filter对象上调用

Stream方法。

List<DeviceEvent> deviceEvents = deviceEventService
        .findAll(loggedInUser()).stream()
        .filter(this::isAlarmMessage)   
        .collect(toList());

此外,您不应创建空ArrayList来收集结果。将Stream.collect与适当的收集器一起使用。

如果findAll返回Iterable,首先需要将其转换为流。

StreamSupport.stream(
    deviceEventService.findAll(loggedInUser()).spliterator(), false)
        .stream() // and so on