kar*_*kpl 3 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);
Run Code Online (Sandbox Code Playgroud)
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());
}
}
Run Code Online (Sandbox Code Playgroud)
然后像这样使用它:
calendar1.generateEntries(criteria).forEach(createConsumer(calendar1, alarms, dates));
calendar2.generateEntries(criteria).forEach(createConsumer(calendar2, alarms, dates));
Run Code Online (Sandbox Code Playgroud)
而且:使用具有副作用的 lambda 表达式或函数是不好的做法(违反函数式编程原则),例如向警报集添加警报或向 lambda 内的日期列表添加日期。更实用的方法是使用转换方法map,然后收集结果。例如:
Set<Alarm> alarms = calendar1.generateEntries(criteria)
.map(entry -> new Alarm(entry.getDate().toLocalTime(), calendar1.getPattern()))
.collect(Collectors.toSet());
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2387 次 |
| 最近记录: |