这是一个减少的问题。将列表降至特定值。总的来说,减少工作在部分解决方案和列表中的项目上。在这种情况下,这意味着将之前的“获胜”值与列表中的新值进行比较,这将在每次比较中计算两次昂贵的操作。
自定义consumer类将允许跟踪昂贵的操作,因为它减少了列表。消费者可以通过处理可变状态来绕过多次调用昂贵的计算。
class Cooler implements Consumer{
String coolestString = "";
int coolestValue = 0;
public String coolest(){
return coolestString;
}
@Override
public void accept(String arg0) {
combine(arg0, expensive(arg0));
}
private void combine (String other, int exp){
if (coolestValue < exp){
coolestString = other;
coolestValue = exp;
}
}
public void combine(Cooler other){
combine(other.coolestString, other.coolestValue);
}
}
该类接受一个字符串,如果它是比以前的赢家冷却器,它取代了它,并节省了昂贵的计算值。
Cooler cooler = Stream.of("java", "php", "clojure", "c", "lisp")
.collect(Cooler::new, Cooler::accept, Cooler::combine);
System.out.println(cooler.coolest());