【发布时间】:2017-06-22 11:08:23
【问题描述】:
Java 8 lambda 在许多情况下都非常有用,可以以紧凑的方式以 FP 方式实现代码。
但是在某些情况下,我们可能不得不访问/改变外部状态,根据 FP 实践,这不是一个好的实践。
(因为 Java 8 函数式接口有严格的输入和输出签名,我们不能传递额外的参数)
例如:
class Country{
List<State> states;
}
class State{
BigInt population;
String capital;
}
class Main{
List<Country> countries;
//code to fill
}
假设用例是获取所有国家/地区所有州的所有首都和所有人口的列表
正常实施:
List<String> capitals = new ArrayList<>();
BigInt population = new BigInt(0);
for(Country country:countries){
for(State state:states){
capitals.add(state.capital);
population.add(state.population)
}
}
如何以更优化的方式使用 Java 8 Streams 实现相同的功能?
Stream<State> statesStream = countries.stream().flatMap(country->country.getStates());
capitals = statesStream.get().collect(toList());
population = statesStream.get().reduce((pop1,pop2) -> return pop1+pop2);
但是上面的实现不是很有效。任何使用 Java 8 Streams 操作多个集合的其他更好的方法
【问题讨论】:
-
你的代码不是“效率不高”,你的代码根本不起作用。
Stream上没有get()方法,并且流不会神奇地为您选择正确的属性。
标签: java lambda functional-programming java-8 java-stream