有没有办法给Java 8中的Consumer参数化呢?我想要一个可重用的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是同一类型
如您所见,这两个消费者只有一个参数不同。是否可能简化此代码/不重复?
collect
更好,但Java没有一种很好的方法可以从一个流中产生两个结果,即alarms
和dates
。 - Peter LawreyConsumer<T>
的存在是为了建模具有副作用的计算。它不返回任何内容,因此,如果它代表的是纯函数,那么这种抽象就是无用的。(确实,像forEach()
这样的stream方法通常在collect()
或reduce()
可以更好地完成工作时使用,但是假设使用Consumer
是正确的选择,那么批评实现Consumer
中固有的副作用就毫无意义了。) - Brian Goetz