Java 8 功能接口(interface)(Consumer)附加参数

标签 java lambda java-8 functional-interface

是否有可能以某种方式对 Java 8 Consumer 进行参数化?我希望有可重用的消费者,我可以在其中放置其他参数。

List<DateTime> dates = new ArrayList<DateTime>();
Set<Alarm> alarms = new HashSet<Alarm>();

Consumer<Entry> entryConsumer1 = entry -> {
    LocalTime time = entry.getDate().toLocalTime();
    Alarm alarm = new Alarm(time, calendar1.getPattern());
    alarms.add(alarm);
    dates.add(entry.getDate());
};

Consumer<Entry> entryConsumer2 = entry -> {
    LocalTime time = entry.getDate().toLocalTime();
    Alarm alarm = new Alarm(time, calendar2.getPattern());
    alarms.add(alarm);
    dates.add(entry.getDate());
};

calendar1.generateEntries(criteria).forEach(entryConsumer1);
calendar2.generateEntries(criteria).forEach(entryConsumer2);

calendar1,calendar2是同一类型

如您所见,两个消费者仅在一个论点上有所不同。是否可以简化此代码/不要重复?

最佳答案

为您的消费者创建工厂方法:

public Consumer<Entry> createConsumer(Calendar calendar, Set<Alarm> alarms, List<DateTime> dates) {
    return entry -> {
        LocalTime time = entry.getDate().toLocalTime();
        Alarm alarm = new Alarm(time, calendar.getPattern());
        alarms.add(alarm);
        dates.add(entry.getDate());
    }
}

然后像这样使用它:

calendar1.generateEntries(criteria).forEach(createConsumer(calendar1, alarms, dates));
calendar2.generateEntries(criteria).forEach(createConsumer(calendar2, alarms, dates));

另外:使用带有副作用的 lambda 表达式或函数是不好的做法(违反函数式编程原则),例如将警报添加到警报集或将日期添加到 lambda 内的日期列表中。更实用的方法是使用 map 等转换方法,然后收集结果。例如:

Set<Alarm> alarms = calendar1.generateEntries(criteria)
    .map(entry -> new Alarm(entry.getDate().toLocalTime(), calendar1.getPattern()))
    .collect(Collectors.toSet());

关于Java 8 功能接口(interface)(Consumer)附加参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37628306/

相关文章:

sorting - 按反转值对 Map<String, Long> 进行排序

java - 如何处理配置/属性文件中的密码

java - 如何知道集合的迭代器是否支持remove()?

lambda - Mercury:如何声明高阶数据类型的确定性?

lambda - Lisp 中的 defun 和 lambda

java - "Impossible"多线程情况下的NPE

java - 将 URL 解析为组件

java - 清理浏览器缓存

lambda - 带有空值检查的 Java 8 lambda 比较器

java - Java 泛型中的独立类型参数