【问题标题】:Java 8 collections: filter with function don't workJava 8 集合:带功能的过滤器不起作用
【发布时间】:2018-07-08 07:03:10
【问题描述】:

我有这段代码,可以从 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&lt;DeviceEvent&gt;

【问题讨论】:

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


    【解决方案1】:

    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
    

    【讨论】:

    猜你喜欢
    • 2021-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-24
    • 2021-05-05
    • 2020-10-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多